当前位置:   article > 正文

说说 Elasticsearch filter 和 post_filter 的区别?

es filter postfilter

1、线上问题

1c6fb92d92f959b034358aba37858664.png

如上所示,问题是:“把 green 这个条件放到 query 里面做一个 bool 查询,有什么不一样吗?”

2、拿官方样例飞行数据举例

这个问题涉及到:filter(过滤器)和 post_filter(后过滤器)的区别,我们拿官方样例索引:kibana_sample_data_flights 做一样演示。

ba7c6bc2126243829a1487093f4b5674.png

3、filter 过滤+聚合的场景

直接上 DSL,检索条件为:过滤目标城市为:CO(缩写代号)的数据,然后以目标天气执行聚合操作。本质是:先过滤后聚合。

  1. POST kibana_sample_data_flights/_search
  2. {
  3.   "query": {
  4.     "bool": {
  5.       "filter": [
  6.         {
  7.           "term": {
  8.             "DestCountry""CO"
  9.           }
  10.         }
  11.       ]
  12.     }
  13.   },
  14.   "aggs": {
  15.     "terms_aggs": {
  16.       "terms": {
  17.         "field""DestWeather",
  18.         "size"10
  19.       }
  20.     }
  21.   }
  22. }

召回结果如下(忽略 检索部分,只保留聚合):88b6c41001094978446ae184f7abd56b.png

4、在filter 基础上加 post_filter 场景

  1. POST kibana_sample_data_flights/_search
  2. {
  3.   "query": {
  4.     "bool": {
  5.       "filter": [
  6.         {
  7.           "term": {
  8.             "DestCountry""CO"
  9.           }
  10.         }
  11.       ]
  12.     }
  13.   },
  14.   "post_filter": {
  15.     "term": {
  16.       "FlightDelay"true
  17.     }
  18.   },
  19.   "aggs": {
  20.     "terms_aggs": {
  21.       "terms": {
  22.         "field""DestWeather",
  23.         "size"10
  24.       }
  25.     }
  26.   }
  27. }

原有的:filter + 聚合没有变化,在此基础上加了:post_filter。

聚合部分结果如下图所示,对比发现,和第2部分结果一致。

53a04de5949231379a3e0107cbc17460.png

但是,我们再查看检索部分的结果,我们用:beyondcompare 软件对比一下,发现基本没有相同的。

39a448077edf127cc629e04cf9e53bb0.png

仔细梳理检索结果,如下截图所示:

c147d2f7a917cc99abf5770ed5326464.png

初步得出结论:

  • post filter :不影响聚合结果。

  • post filter:是在检索+聚合之后,对已有数据再次进行的过滤。所以,不影响聚合结果。

5、把 post filter 过滤条件移动到 filter 内部会怎么样呢?

检索语句为:

  1. POST kibana_sample_data_flights/_search
  2. {
  3.   "query": {
  4.     "bool": {
  5.       "filter": [
  6.         {
  7.           "term": {
  8.             "DestCountry""CO"
  9.           }
  10.         },
  11.         {
  12.           "term": {
  13.             "FlightDelay"true
  14.           }
  15.         }
  16.       ]
  17.     }
  18.   },
  19.   "aggs": {
  20.     "terms_aggs": {
  21.       "terms": {
  22.         "field""DestWeather",
  23.         "size"10
  24.       }
  25.     }
  26.   }
  27. }

直接看聚合结果:很明显聚合结果完全不一样!为什么?

检索条件更加细化了,样本值减少了,所以聚合数据结果各项都少了很多

初步结论:filter 过滤+聚合操作,本质是先 filter 过滤,然后再聚合操作。聚合是在已有 filter 过滤基础上执行的。

6、post_filter 还可以自定义评分

  1. POST kibana_sample_data_flights/_search
  2. {
  3.   "query": {
  4.     "bool": {
  5.       "filter": [
  6.         {
  7.           "term": {
  8.             "DestCountry""CO"
  9.           }
  10.         }
  11.       ]
  12.     }
  13.   },
  14.   "post_filter": {
  15.     "term": {
  16.       "FlightDelay"true
  17.     }
  18.   },
  19.   "rescore": {
  20.     "window_size"50,
  21.     "query": {
  22.       "rescore_query": {
  23.         "term": {
  24.           "FlightDelay"true
  25.         }
  26.       },
  27.       "query_weight"0.7,
  28.       "rescore_query_weight"12
  29.     }
  30.   }
  31. }

在已有评分基础上,二次评分,这属于用户自定义评分的范畴。

7、小结

  • filter,应用于带 filter 子句的布尔查询,搜索请求后 filter 过滤条件对检索和聚合都产生影响。

  • post_filter,应用于执行检索之后或者聚合之后,可以看做“后过滤器”,对检索或聚合之后的结果集再进行过滤,只检索结果受影响。

推荐阅读

  1. 如何从0到1打磨一门 Elasticsearch 线上直播课?

  2. 重磅 | 死磕 Elasticsearch 方法论认知清单(2021年国庆更新版)

  3. 如何系统的学习 Elasticsearch ?

  4. 吃透 | Elasticsearch filter和query的不同

fba781490e28c695e598a862e6ab8cba.gif

比同事抢先一步学习进阶干货!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/817737
推荐阅读
相关标签
  

闽ICP备14008679号