Elasticsearch:聚合过滤嵌套对象以查找唯一值
Elasticsearch: Aggregation on filtered nested objects to find unique values
我在 Elasticsearch 5 的每个文档中都有一个对象(标签)数组:
{
"tags": [
{ "key": "tag1", "value": "val1" },
{ "key": "tag2", "value": "val2" },
...
]
}
现在我想为某个标签键找到唯一的标签值。与此 SQL 查询类似的内容:
SELECT DISTINCT(tags.value) FROM tags WHERE tags.key='some-key'
到目前为止我已经接触过这个DSL:
{
"size": 0,
"aggs": {
"my_tags": {
"nested": {
"path": "tags"
},
"aggs": {
"filter" : { "terms": { "tags.key": "tag1" } },
"aggs": {
"my_tags_values": {
"terms" : {
"field" : "tags.value",
"size": 9999
}
}
}
}
}
}
}
但是它向我显示了这个错误:
[terms] unknown field [tags.key], parser not found
.
这是解决问题的正确方法吗?感谢您的帮助。
注意:我已将 tags
字段声明为映射中的嵌套字段。
你搞混了。您可能想添加一个 filter
聚合,但没有给它任何名称:
{
"size": 0,
"aggs": {
"my_tags": {
"nested": {
"path": "tags"
},
"aggs": {
"my_filter": {
"filter": {
"terms": {
"tags.key": [
"tag1"
]
}
},
"aggs": {
"my_tags_values": {
"terms": {
"field": "tags.value",
"size": 9999
}
}
}
}
}
}
}
}
在过滤器聚合中尝试Bool Query:
{
"size": 0,
"aggs": {
"my_tags": {
"nested": {
"path": "tags"
},
"aggs": {
"filter": {
"bool": {
"must": [
{
"term": {
"tags.key": "tag1"
}
}
]
},
"aggs": {
"my_tags_values": {
"terms": {
"field": "tags.value",
"size": 0
}
}
}
}
}
}
}
}
顺便说一句:如果你想检索所有的桶,你可以在聚合大小中写 0
而不是 9999
。
我在 Elasticsearch 5 的每个文档中都有一个对象(标签)数组:
{
"tags": [
{ "key": "tag1", "value": "val1" },
{ "key": "tag2", "value": "val2" },
...
]
}
现在我想为某个标签键找到唯一的标签值。与此 SQL 查询类似的内容:
SELECT DISTINCT(tags.value) FROM tags WHERE tags.key='some-key'
到目前为止我已经接触过这个DSL:
{
"size": 0,
"aggs": {
"my_tags": {
"nested": {
"path": "tags"
},
"aggs": {
"filter" : { "terms": { "tags.key": "tag1" } },
"aggs": {
"my_tags_values": {
"terms" : {
"field" : "tags.value",
"size": 9999
}
}
}
}
}
}
}
但是它向我显示了这个错误:
[terms] unknown field [tags.key], parser not found
.
这是解决问题的正确方法吗?感谢您的帮助。
注意:我已将 tags
字段声明为映射中的嵌套字段。
你搞混了。您可能想添加一个 filter
聚合,但没有给它任何名称:
{
"size": 0,
"aggs": {
"my_tags": {
"nested": {
"path": "tags"
},
"aggs": {
"my_filter": {
"filter": {
"terms": {
"tags.key": [
"tag1"
]
}
},
"aggs": {
"my_tags_values": {
"terms": {
"field": "tags.value",
"size": 9999
}
}
}
}
}
}
}
}
在过滤器聚合中尝试Bool Query:
{
"size": 0,
"aggs": {
"my_tags": {
"nested": {
"path": "tags"
},
"aggs": {
"filter": {
"bool": {
"must": [
{
"term": {
"tags.key": "tag1"
}
}
]
},
"aggs": {
"my_tags_values": {
"terms": {
"field": "tags.value",
"size": 0
}
}
}
}
}
}
}
}
顺便说一句:如果你想检索所有的桶,你可以在聚合大小中写 0
而不是 9999
。