我正在尝试按照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]
答案 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
}
}
}
}
}
}
}
}
}
}
然后,您可以根据前缀获取唯一字段。