3

假设我有以下文档:

{
    "title": "Some Title",
    options: {
        "key5": 1,
        "key3": 0,
        "key1": 1,
    }
},
{
    "title": "Some Title",
    options: {
        "key2": 0,
        "key3": 0,
        "key5": 1,
    }
}

我想options使用 facet 从对象中获取所有键。

如果options是一个简单的键数组作为字符串,我会简单地使用这样的方面:

"facets" : {
    "options" : {
        "terms" : {
            "field" : "options"
        }
    }
}

但它在我的情况下不起作用。

因此,如果 aquery返回这两个文档,我应该得到这些键: ["key5","key3","key1","key2"]

我真正需要什么样的方面?

4

2 回答 2

2

您不能使用构面来做到这一点。您有 2 个选择 -

  1. 保留您当前的文档结构并从类型映射中获取键列表(请参阅http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-get-mapping.html)。这带来了包含所有遇到的字段的类型的方案。

  2. 改变你的结构。将键也保留为字段,因此您的选项数组成为文档数组,例如:

    "options" :
    [
    { "key" : "key1", "value" : 1},
    { "key" : "key2", "value" : 0}
    ]

您可能希望在搜索或分面时保留键值对的上下文,因此将其配置为嵌套类型(http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-nested-类型.html )。然后,您可以在“options.key”字段中获取顶级键列表。

于 2013-10-21T08:50:17.570 回答
0

如果我理解正确,您会希望为terms_facet嵌套选项对象中的每个字段创建一个。一种“通配符方面”?

我认为 facet api 中没有允许这种操作的功能。如果我没记错的话,必须映射用于分面的字段,因此可以通过检查索引映射在单独的查询中提取字段。

于 2013-10-20T17:34:18.330 回答