从弹性搜索中的对象获取所有键的方面

时间:2013-10-20 16:23:45

标签: elasticsearch faceted-search

假设我有以下文档:

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

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

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

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

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

因此,如果query返回这两个文档,我应该得到以下密钥:[“key5”,“key3”,“key1”,“key2”]

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

2 个答案:

答案 0 :(得分: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}
    ]

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

答案 1 :(得分:0)

如果我理解正确,您可能希望为嵌套选项对象中的每个字段创建terms_facet。有点像“通配符”?

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