Post filter
原文链接 : https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-post-filter.html
译文链接 : http://www.apache.wiki/pages/editpage.action?pageId=4883094
贡献者 : ping
在已经计算了聚合之后,post_filter 应用于搜索请求的最后的搜索命中。 其目的最好通过例子解释:
想象一下,你卖的有以下属性的衬衫:
PUT /shirts{"mappings": {"item": {"properties": {"brand": { "type": "keyword"},"color": { "type": "keyword"},"model": { "type": "keyword"}}}}}PUT /shirts/item/1?refresh{"brand": "gucci","color": "red","model": "slim"}
想象一下,用户已经指定了两个过滤器:
颜色:红色,品牌:gucci 。 你只想在搜索结果中显示 Gucci 制作的红色衬衫。 通常你会使用布尔查询:
GET /shirts/_search{"query": {"bool": {"filter": [{ "term": { "color": "red" }},{ "term": { "brand": "gucci" }}]}}}
但是,您还希望使用 faceted navigation 来显示用户可以单击的其他选项的列表。 也许你有一个模型字段,允许用户将搜索结果限制为红色的 Gucci T恤或连衣裙。
这可以通过 terms aggregation 来完成:
GET /shirts/_search{"query": {"bool": {"filter": [{ "term": { "color": "red" }},{ "term": { "brand": "gucci" }}]}},"aggs": {"models": {"terms": { "field": "model" } ①}}}
① 返回 Gucci 最受欢迎的红色衬衫款式。
但也许你也想告诉用户有多少 Gucci 衬衫可用其他颜色。 如果只是在颜色字段上添加术语聚合,则只会返回红色,因为您的查询只返回 Gucci 的红色衬衫。
相反,您希望在聚合期间包括所有颜色的衬衫,然后仅将颜色过滤器应用于搜索结果。 这是 post_filter 的目的:
GET /shirts/_search{"query": {"bool": {"filter": {"term": { "brand": "gucci" } ①}}},"aggs": {"colors": {"terms": { "field": "color" } ②},"color_red": {"filter": {"term": { "color": "red" } ③},"aggs": {"models": {"terms": { "field": "model" } ④}}}},"post_filter": {"term": { "color": "red" } ⑤}}
|
①
|
主查询现在查找 Gucci 的所有衬衫,而不考虑颜色。
| |
②
|
colors agg 返回 Gucci 的衬衫的流行颜色。
| |
③
④
|
color_red agg 将模型子聚合限制为红色 Gucci 衬衫。
| |
⑤
| 最后,post_filter 从搜索命中中除去红色以外的颜色。 |
