作者:郑小蒜9299_941611_G | 2023-06-14 13:43
给定一组在一个字段中具有给定值的文档,我想知道有多少文档具有第二个字段的每个值.
我尝试使用以下查询的术语聚合来做到这一点:
{
"size": 0,
"filter": {
"term": {
"field1": "value"
}
},
"aggregations": {
"field2" : {
"terms" : { "field" : "field2" }
}
}
}
但返回的计数显示整个索引中第二个字段的每个值的文档数,而不限于第一个字段具有给定值的文档.
我究竟做错了什么?
1> Mihai Ionesc..:
您是否尝试过使用过滤查询?
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"term": {
"field1": "value"
}
}
}
},
"aggregations": {
"field2": {
"terms": { "field": "field2" }
}
}
}
但是[文档](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-filters.html)建议使用过滤器而不是查询来按精确值过滤?另一个问题:如何应用多个条件?过滤器提供[`和`](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-and-filter.html),没有找到查询...
@VitorM是的,聚合总是在查询范围内运行(默认情况下使用`match_all`).不,你不应该停止使用聚合过滤器.有一个[过滤查询](http://www.elastic.co/guide/en/elasticsearch/reference/1.5/query-dsl-filtered-query.html)通过性能和缓存过滤器来缩小范围,然后是a [过滤器聚合](http://www.elastic.co/guide/en/elasticsearch/reference/1.5/search-aggregations-bucket-filter-aggregation.html)过滤其子分段的聚合桶.将这两者结合起来可以实现真正强大的过滤.
2> Mehmet K..:
这里有一个比较:https:
//www.elastic.co/guide/en/elasticsearch/guide/current/_post_filter.html
简而言之,您的顶级过滤器就像链接中的post_filter一样.要过滤,然后计算聚合,您需要使用查询.
如果您因为查询中的分数计算而担心性能损失,您可以查看基本上是过滤器包装器查询的常量分数查询.