ElasticSearch:仅聚合数组中匹配的元素

时间:2018-04-16 12:21:32

标签: elasticsearch

在ElasticSearch 6.2中,如何仅聚合实际匹配查询的数组中的那些元素?我的请求如下:

{
    "query": {
            "bool":{
                    "must":[ 
                           {"prefix":{"titles":"I_match_the"}},
                           {"match":{"database":"EXAMPLE_SOURCE"}}
                    ]
             }
    },
    "size":0,
    "aggs":{
        "aggregatedTitle": {
            "terms":{
                "field":"titles.keyword",
                "size":10
            }
        }
    }
}

回复:

{
...
"aggregations": {
    "aggregatedTitle": {
        "buckets": [
            {
                "key": "I_match_the_query",
                "doc_count": 3
            },
            {
                "key": "I_dont_match_but_lie_in_the_same_array_as_matched_element",
                "doc_count": 3
            },
            {
                "key": "I_dont_match_but_also_lie_in_the_same_array_as_matched_element",
                "doc_count": 3
            },
        ]
    }
}

但响应中的存储区包含“titles.keyword”-array中的所有元素,而不仅仅是具有键I_match_the_query的元素。我如何过滤掉那些在我的例子中我只得到第一个桶?

我认为我必须使用nested查询,但我不确定我是否还需要inner_hits,例如:https://www.elastic.co/guide/en/elasticsearch/reference/6.2/nested.html如果我这样做,如何汇总这些查询。

1 个答案:

答案 0 :(得分:0)

我在问题中没有问过什么(直到今天我自己都不知道)但需要回答它,是属性" titles.keyword"应该是一个嵌套列表。如果没有该配置,则无法进行过滤。调整后端后,您可以进行类似的查询

  "nested":{
     "path":"title",
     "query":{
        "bool":{
           "must":[
              {
                 "term":{
                    "title.keyword":"I_match_the"
                 }
              }
           ]
        }
     },
     "inner_hits": {
        "docvalue_fields" : ["title.keyword"]
     }
  }

然后在您收到的fields.title.keyword值上进行存储桶聚合