【问题标题】:Aggregating over _field_names in elasticsearch 5在elasticsearch 5中聚合_field_names
【发布时间】:2017-04-12 06:39:06
【问题描述】:

我正在尝试聚合 ES 5 中的字段名称,如 Elasticsearch aggregation on distinct keys 中所述,但那里描述的解决方案不再有效。

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

数据:

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]

【问题讨论】:

  • 您可以尝试将 '_field_names' 替换为 '_field_names.keyword'。

标签: elasticsearch aggregation


【解决方案1】:

环顾四周后,似乎在 ES > 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 啊,对不起。错误是:Fielddata is not supported on field [_field_names] of type [_field_names]
    • 嗯,这是一个不同的问题。您可以尝试完全删除include 参数吗?
    • 我尝试在自己的机器上删除包含,但无济于事。
    猜你喜欢
    • 1970-01-01
    • 2017-09-24
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多