Elasticsearch-如何过滤嵌套的聚合桶?
我正在尝试过滤存储桶中的嵌套聚合。
对应:
{ "dev.directory.3" : {
"mappings" : {
"profile" : {
"properties" : {
"events" : {
"type" : "nested",
"properties" : {
"id" : {
"type" : "integer"
},
"name" : {
"type" : "string",
"index" : "not_analyzed"
},
}
},
"title" : {
"type" : "string"
}
}
}
}
}
}
索引数据:
"hits" : { "total" : 1,
"max_score" : 1.0,
"hits" : [ {
"_index" : "dev.directory.3",
"_type" : "profile",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"title" : "Project manager",
"events" : [
{
"id" : 1,
"name" : "Event A",
},
{
"id" : 2,
"name" : "Event B",
},
{
"id" : 3,
"name" : "Event C",
},
{
"id" : 4,
"name" : "Event D",
}
],
}
}
]
}
我正在使用此查询和聚合定义
{ "query": {
"nested": {
"path": "events",
"query": {
"bool": {
"filter": [{
"terms": {
"events.id": [1, 2]
}
}]
}
},
"inner_hits": {}
}
},
"aggs": {
"events.name12": {
"filter": {},
"aggs": {
"inner": {
"nested": {
"path": "events"
},
"aggs": {
"events.name": {
"terms": {
"field": "events.name"
}
},
"events.name_count": {
"cardinality": {
"field": "events.name"
}
}
}
}
}
}
},
"size": 20,
"_source": ["email", "company_name", "events"]
}
我从聚合结果中得到的是:
"aggregations": { "events.name12": {
"doc_count": 2,
"filtered": {
"doc_count": 4,
"events.name": {
"buckets": [
{
"key": "Event A",
"doc_count": 1
},
{
"key": "Event B",
"doc_count": 1
},
{
"key": "Event C",
"doc_count": 1
},
{
"key": "Event D",
"doc_count": 1
}
]
},
"events.name_count": {
"value": 4
}
}
}
我在筛选存储桶列表时遇到了麻烦,因为它们只能提供所提供的事件ID,因此结果应类似于:
"aggregations": { "events.name12": {
"doc_count": 2,
"filtered": {
"doc_count": 2,
"events.name": {
"buckets": [
{
"key": "Event A",
"doc_count": 1
},
{
"key": "Event B",
"doc_count": 1
}
]
},
"events.name_count": {
"value": 2
}
}
}
回答:
您快到了,只需要events.id
在聚合中添加过滤器即可,如下所示:
{ "query": {
"nested": {
"path": "events",
"query": {
"bool": {
"filter": [
{
"terms": {
"events.id": [
1,
2
]
}
}
]
}
},
"inner_hits": {}
}
},
"aggs": {
"events.name12": {
"nested": {
"path": "events"
},
"aggs": {
"inner": {
"filter": {
"terms": {
"events.id": [
1,
2
]
}
},
"aggs": {
"events.name": {
"terms": {
"field": "events.name"
}
},
"events.name_count": {
"cardinality": {
"field": "events.name"
}
}
}
}
}
}
},
"size": 20,
"_source": [
"email",
"company_name",
"events"
]
}
原因是您的查询将正确选择具有指定事件ID的嵌套事件的所有文档,但是,汇总将对所有选定文档中的所有嵌套事件进行处理。因此,您还需要从聚合中也没有正确ID的那些文档中过滤掉所有嵌套事件。
以上是 Elasticsearch-如何过滤嵌套的聚合桶? 的全部内容, 来源链接: utcz.com/qa/411958.html