在elasticsearch 5中聚合_field_names

时间:2016-11-28 13:55:35

标签: elasticsearch aggregation

我正在尝试按照Elasticsearch aggregation on distinct keys中的描述聚合ES 5中的字段名称,但是那里描述的解决方案已不再适用了。

我的目标是获取所有文档的密钥。映射是默认映射。

数据:

PUT products/product/1
{
    "param": {
        "field1": "data",
        "field2": "data2"
    }   
}

查询:

GET _search
{
    "aggs": {
        "params": {
            "terms": {
                "field": "_field_names",
                "include" : "param.*",   
                "size": 0
            }

        }
    }
}

我收到以下错误:Fielddata is not supported on field [_field_names] of type [_field_names]

2 个答案:

答案 0 :(得分:0)

这可能是因为ES 5中的setting size: 0 is not allowed anymore。您现在必须设置特定大小。

POST _search
{
    "aggs": {
        "params": {
            "terms": {
                "field": "_field_names",
                "include" : "param.*",   
                "size": 100                <--- change this
            }

        }
    }
}

答案 1 :(得分:0)

环顾四周之后,这似乎是ES&gt;的唯一途径。 5.X获取唯一字段名称是通过映射端点,因为无法在_field_names上聚合,您可能需要稍微更改数据格式,因为映射端点将返回每个字段而不管嵌套。

我个人的问题是获取各种子/父文件的唯一密钥。

我发现如果你在点击映射端点时以prefix.field格式为你的字段名称添加前缀,它会自动为你嵌套信息。

PUT products/product/1
{
    "param.field1": "data",
    "param.field2": "data2",
    "other.field3": "data3"
}   

GET products/product/_mapping
{
    "products": {
        "mappings": {
            "product": {
                "properties": {
                    "other": {
                        "properties": {
                            "field3": {
                                "type": "text",
                                "fields": {
                                    "keyword": {
                                        "type": "keyword",
                                        "ignore_above": 256
                                    }
                                }
                            }
                        }
                    },
                    "param": {
                        "properties": {
                            "field1": {
                                "type": "text",
                                "fields": {
                                    "keyword": {
                                        "type": "keyword",
                                        "ignore_above": 256
                                    }
                                }
                            },
                            "field2": {
                                "type": "text",
                                "fields": {
                                    "keyword": {
                                        "type": "keyword",
                                        "ignore_above": 256
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

然后,您可以根据前缀获取唯一字段。