原文地址: https://www.elastic.co/guide/cn/elasticsearch/guide/current/_filter_bucket.html, 版权归 www.elastic.co 所有
英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/_filter_bucket.html
英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/_filter_bucket.html
请注意:
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
过滤桶 (Filter Bucket)edit
但是如果我们只想对聚合结果过滤怎么办? 假设我们正在为汽车经销商创建一个搜索页面, 我们希望显示用户搜索的结果,但是我们同时也想在页面上提供更丰富的信息,包括(与搜索匹配的)上个月度汽车的平均售价。
这里我们无法简单的做范围限定,因为有两个不同的条件。搜索结果必须是 ford
,但是聚合结果必须是 ford
且 销售时间是在一个月前(sold > now - 1M
) 。
为了解决这个问题,我们可以用一种特殊的桶,叫做 filter
(过滤桶) 。 我们可以指定一个过滤桶,当文档满足过滤桶的条件时,我们将其加入到桶内。
查询结果如下:
GET /cars/transactions/_search { "size" : 0, "query":{ "match": { "make": "ford" } }, "aggs":{ "recent_sales": { "filter": { "range": { "sold": { "from": "now-1M" } } }, "aggs": { "average_price":{ "avg": { "field": "price" } } } } } }
因为 filter
桶和其他桶的操作方式一样,所以可以随意将其他桶和度量嵌入其中。所有嵌套的组件都会 "继承" 这个过滤,这使我们可以按需针对聚合过滤出选择部分。