理解 elasticsearch 的 post_filter
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
《Elasticsearch 权威指南中,post_filter 出现在聚合章节,描述 post_filter 的作用为:只过滤搜索结果,不过滤聚合结果;
描述比较简单,还是用实例来加深理解吧。
环境信息
以下是本次实例的环境信息,请确保您的 Elasticsearch 可以正常运行:
操作系统:Ubuntu 18.04.2 LTS
JDK:1.8.0_191
Elasticsearch:6.7.1
Kibana:6.7.1
实例数据
查询用到的数据是个名为 cars 的索引,里面保存了多条汽车销售记录,字段有品牌(make)、颜色(color)、价格(price)、售卖时间(sold)等,在 elasticsearch-head 查看数据如下图:
如果您想将上图中的数据导入到自己的 es 环境,请参考《Elasticsearch聚合学习之一:基本操作》,文中有详细的导入步骤;
假设一个查询聚合的需求
对上述索引,假设我们的查询需求是:品牌为 ford 的汽车有哪些颜色
这个需求是容易实现的:先限定查询范围(品牌为 ford),再用类型为 terms 的桶对 color 字段做聚合;
具体的 DSL 怎么写呢?随着我们想要的数据的不同,有不同的写法:
第一种:用查询结果生成聚合结果,然后只返回聚合结果
只要设置 size 参数为 0,就不会返回查询结果(返回 JSON 中,hits.hits 的数组长度为 0):
返回内容中只有聚合结果:
第二种:用查询结果生成聚合结果,然后返回聚合结果和查询结果
如果我们想在返回内容中包含查询结果,只要把**"size": 0,**这个参数去掉即可:
返回的内容如下所示,hits.hits 的内容不再为空,而是包含了查询结果,至于聚合结果和前面是一样的:
第三种:用查询结果生成聚合结果,然后返回聚合结果和被再次过滤后的查询结果
第三种返回的聚合结果与前面两种一模一样,都是品牌为 ford 的汽车的颜色;
聚合结果生成完毕后,查询结果可以根据 post_filter 参数的设置而被再次过滤,例如品牌为 ford 的汽车,可以把其他颜色过滤掉,只要蓝色的,然后再返回,此时返回的查询结果中就只有品牌为 ford 并且颜色是 blue 的文档,具体的 DSL 如下:
返回数据如下,可见聚合结果和前面两种一模一样,只是查询结果中只有 color 字段为 blue 的文档:
至此,post_filter 的基本功能已介绍完毕,如果只做查询不做聚合,post_filter 的作用和我们常用的 filter 是类似的,但由于 post_filter 是在查询之后才会执行,所以 post_filter 不具备 filter 对查询带来的好处(忽略评分、缓存等),因此,在普通的查询中不要用 post_filter 来替代 filter;
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/877e25ec7805e25af5bdb5e80】。文章转载请联系作者。
评论