在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如果我这样做,如何汇总这些查询。
答案 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
值上进行存储桶聚合