今天来了解下 Elasticsearch(以下简称 ES) 中的 Query 和 Filter。

在 ES 中,提供了 Query 和 Filter 两种搜索:

  • Query Context:会对搜索进行相关性算分
  • Filter Context:不需要相关性算分,能够利用缓存来获得更好的性能

举一个栗子,比如需要搜索一场电影,包含以下信息:

评论中包含了烧脑,评分高于 8 分,同时上映时间在 2010 到 2020 之间。

所以这个搜索包括了三个判断逻辑,针对三个不同的字段进行查询,如果需要满足这样的查询需求,在 ES 当中提供了 bool 查询,一个 bool 查询可以包含一个或多个查询字句,支持以下四种查询:

  • must:必须匹配,贡献算分
  • should:选择性匹配,贡献算分
  • must_not:查询字句,必须不能匹配
  • filter:必须匹配,不贡献算分

上图是一个 bool 查询,是对用户(user)进行搜索,城市必须是北京(beijing) ,性别必须是男(man),这个采用的是 filter,说明这个对算分是不会产生影响的,must_not 是一个 range 的查询:年龄大于等于 35 岁;should 里是一个数组,说明这个 should 中可以写多个条件,只要用户的名字是这两个中的一个就是满足条件的。

其实,bool 查询的子查询可以任意顺序出现,并且可以嵌套多个查询。

另外,should 的使用分两种情况:

  • bool 查询中只包含 should,不包含 must 查询
  • bool 查询中同时包含 should 和 must 查询

下面让我们来看看这两种情况有何不同?

如果在 bool 查询中没有 must 子句,should 中必须至少满足一条查询(可以通过 minimum_should_match 来设置满足条件的个数或者百分比)。

同时包含 should 和 must 时,文档不必满足 should 中的条件,但是如果满足条件,会增加相关性算分。

Filter Context

上面说到了 filtermust_not 是不会影响算分的,通过查询结果中可以看到 _score 都是 0。


Query Context

采用 should 查询,会进行算分处理,结果如下图所示:


同时,查询语句的结构,也会对相关度算分产生影响:

  • 同一层级的查询字段,权重是相同的
  • 通过嵌套 bool 查询,可以改变对算分的影响

Boost & Boosting Query

相关度还可以通过对某个字段设置 boost 的值来进行控制:

  • 当 boost > 1 时,打分的相关度相对性提升
  • 当 0 < boost < 1 时,打分的权重相对性降低
  • 当 boost < 0 时,贡献负分

或者使用 ES 提供的 Boosting Query 进行查询:

首先插入几条数据用于测试:

POST /product/_bulk{ "index": { "_id": 1 }}{ "content":"Apple Mac" }{ "index": { "_id": 2 }}{ "content":"Apple iPad" }{ "index": { "_id": 3 }}{ "content":"Apple Juice" }

如下图所示,左边就是一个 Boosting Query,positive 查询意思是如果 content 中包含 Apple 会按照原始的相关性分数进行打分,negative 查询则是满足 positive 查询同时满足 negative 查询(content 中包含 Juice)的会按照原始的相关性分数乘以 negative_boost 进行打分,negative_boost 是用于降低与 negative 匹配文档的相关性算分的。


如右图所示,这个的查询结果为三条数据,可以发现 Apple MacApple iPad 的相关性算分相同,都排在前面,而 Apple Juice 的相关性算分是其他两个的 0.1 倍,排在最后。

用一个表格来总结下 Query Context 和 Filter Context 的区别:

Context Type 含义 使用方式
Query 查找与查询语句最匹配的文档,对所有文档进行相关性算分并排序 query;bool 中的 must 和 should
Filter 查找与查询语句相匹配的文档 bool 中的 filter 和 must_not;constant_score 中的 filter

filter 不需要计算相关性算分,不需要按照相关分数进行排序,同时还有内置的自动 cache 最常使用的 filter 的数据,而 query 相反,需要计算相关性算分,按照分数进行排序,而且无法 cache 结果,因此在某些不需要相关性算分的查询场景,尽量使用 Filter Context 来让查询更加高效。

下图为 eBay 对于 Filter Context 和 Query Context 的性能比较:

Filter Context VS Query Context

那么 filter 的 cache 是怎么做的呢?

ES 会构建一个文档匹配过滤器的位集 bitset(用来标识一个文档对一个 filter 条件是否匹配,如果匹配就是 1,不匹配就是 0),下次再有这个 filter 条件过来的时候就不用重新扫描倒排索引,反复生成 bitset,可以大幅度提升性能,另外当添加或更新文档时,这个 filter 的位集 bitset 也会更新。

总结

当用户输入多个条件进行查询的时候,可以使用 bool 查询,在 bool 查询中,filtermust_not 属于 Filter Context,不会对算分结果产生影响;mustshould 属于 Query Context,会对结果算分产生影响。

在 bool 查询中,查询结构是对相关性算分有影响的,可以通过嵌套的方式修改不同字段在查询中的权重以及直接通过指定字段的 boost 值来控制在搜索中的权重,另外使用 Boosting Query 可以提升搜索的精准性,同时也可以将更多的搜索显示在结果中。

留言讨论

最好的关系就是互相成就,大家的点赞、在看、分享、留言就是我创作的最大动力。

参考

Elastic Stack从入门到实践

Elasticsearch核心技术与实战

Elasticsearch顶尖高手系列-快速入门篇

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-boosting-query.html

   ●Spring Boot 集成 Elasticsearch 实战●看完这篇还不会 Elasticsearch 搜索,那我就哭了!●全文搜索引擎 Elasticsearch 入门:集群搭建

web.xml filter 不包含_Elasticsearch 之 Filter 与 Query 有啥不同?相关推荐

  1. web.xml 里context-param 、listener、 filter、servlet 加载顺序

    1.web.xml中context-param .listener. filter.servlet 加载顺序与其位置无关,不是listener在context-param 前面就先加载listener ...

  2. JavaWeb的web.xml中context-param、listener、filter、servlet加载顺序(重点)

    文章目录 结论 分析 1.context-param 2.listener 3.filter 4.servlet 总结 结论 先说结论,在JavaWeb的web.xml中的加载顺序为: context ...

  3. 从web.xml谈谈SpringMVC集成spring的初始化流程及SpringBoot集成SpringMVC

    一.关于servlet 详解servlet,https://www.runoob.com/servlet/servlet-tutorial.html 总览一下: servlet与servlet容器 J ...

  4. JavaWeb web.xml配置详解

    参考: XML 教程 Java web之web.xml配置详解 Javaweb三大组件是:Servlet,Filter,Listener. 1.Servlet Servlet作为中转处理的容器,连接了 ...

  5. web.xml 文件中的配置节的加载顺序

    为什么80%的码农都做不了架构师?>>>    web.xml 文件中一般包括 servlet, filter, listener 等的配置,那么它们是按照一个什么顺序加载呢? 首先 ...

  6. Spring web.xml详解

    web.xml文件是Java Web项目中的一个配置文件,主要用于配置欢迎页.Filter.Listener.Servlet等,但并不是必须的,一个Java Web项目没有web.xml文件也是照样能 ...

  7. JavaWeb项目 Web.xml文件详解(启动顺序)

    web.xml作用是用来初始化配置信息的. 比如:Welcome页面.servlet.servlet-mapping.filter.listener.启动加载级别等 web.xml加载过程(步骤) 当 ...

  8. web.xml过滤html,Servlet过滤器两种配置方法(注解、配置web.xml文件)

    方法一(注解) /** * 使用注解标注过滤器 * @WebFilter将一个实现了javax.servlet.Filte接口的类定义为过滤器 * 属性filterName声明过滤器的名称,可选 * ...

  9. web.xml 中的listener、 filter、servlet 加载顺序及其详解(转)

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

最新文章

  1. YII显示sql进行调试
  2. SSH远程管理(用户登录控制及密码验证)
  3. python列表、元组、字典和集合的算法时间_27.Python列表(list)、元组(tuple)、字典(dict)和集合(set)详解...
  4. shiro认证与授权:自定义realm
  5. union-find算法分析(1)
  6. MDX中Filter 与Exist的区别
  7. 原来热加载如此简单,手动写一个 Java 热加载吧
  8. flash动画制作成品_「咻动画」flash动画在制作方面有哪些优势?
  9. windows vs编译环境 python_Python虚拟环境使用(Windows)
  10. 品运维自动化之cobbler的安装序
  11. QCon杭州2012技术开发大会感受
  12. 2020.10.20英语前端电话面试总结
  13. 干货分享丨精心整理了份Python知识点高清速查表!太受用了!
  14. 352记--扬哥本纪
  15. CSS——引入阿里字体图标步骤
  16. GitHub上最火的40个iOS开源项目
  17. 计算机网络专业运动会入场式,这所学校运动会开幕式亮了!各方阵带着专业C位亮相...
  18. 海康威视硬件工程师校招一面面经
  19. 电力电子技术 DC-DC变换器基本结构
  20. 泉州计算机中专学校,2021泉州中专学校排名榜

热门文章

  1. 今晚7点30,腾讯专家与你共探广告智能创意新可能
  2. 自然语言处理之TF-IDF
  3. 其他service 单例 工具类_获取不到,虚拟来凑?这个工具不得不学!
  4. 从0成为Facebook广告高手系列教程
  5. ubuntu下mysql语句_Ubuntu安装mysql及常用SQL操作语句
  6. 面试准备每日五题:C++(三)——全局局部变量、内存分配、strcpysprintfmemcpy、函数指针、引用
  7. 该设备或资源(Web代理)未设置为接受端口“7890“上的连接解决方案
  8. 吴恩达机器学习3——逻辑回归、正则化
  9. 分布式CAP原理:一致性、可用性、分区容错
  10. python 插值_有序点列的样条插值