Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Elasticsearch 之 Filter 与 Query 有啥不同?

Elasticsearch 之 Filter 与 Query 有啥不同?

作者头像
武培轩
发布于 2021-02-22 06:41:23
发布于 2021-02-22 06:41:23
1.5K00
代码可运行
举报
文章被收录于专栏:武培轩的专栏武培轩的专栏
运行总次数:0
代码可运行

今天来了解下 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 进行查询:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 的 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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-02-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
实战 | Elasticsearch自定义评分的N种方法
比如:同样输入“锤子”,工匠期望的是钉子对应的“锤子”,老罗的粉丝期望的是“锤子科技”、“锤子便签”、“锤子手机”等。
铭毅天下
2020/03/18
6.4K0
Elasticsearch(七)——复合查询
将查询内部的结果文档得分都设定为1或者boost的值,多用于结合bool查询实现自定义得分
羊羽shine
2019/05/29
2K0
Elasticsearch Query DSL之Compound queries(复合查询)
本文将重点介绍Elasticsearch Query DSL之Compound queries(复合查询)。
丁威
2019/06/10
1.4K0
【Elasticsearch】DSL查询文档
Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:
陶然同学
2023/10/14
4470
【Elasticsearch】DSL查询文档
一起学Elasticsearch系列-Query DSL
DSL是Domain Specific Language的缩写,指的是为特定问题领域设计的计算机语言。这种语言专注于某特定领域的问题解决,因而比通用编程语言更有效率。
BookSea
2023/11/13
5511
一起学Elasticsearch系列-Query DSL
学好Elasticsearch系列-Query DSL
DSL是Domain Specific Language的缩写,指的是为特定问题领域设计的计算机语言。这种语言专注于某特定领域的问题解决,因而比通用编程语言更有效率。
BookSea
2023/08/03
3540
学好Elasticsearch系列-Query DSL
Elasticsearch使用:Search 概括
在 Elasticsearch 中的搜索中,有两类搜索:queries和aggregations。
HLee
2021/01/27
1.2K0
Elasticsearch使用:Search 概括
吃透 | Elasticsearch filter和query的不同
除了确定文档是否匹配外,查询子句还计算了表示文档与其他文档相比匹配程度的_score。
铭毅天下
2018/07/26
2.1K0
吃透 | Elasticsearch filter和query的不同
ElasticSearch权威指南:深入搜索(上)
在 基础入门 中涵盖了基本工具并对它们有足够详细的描述,这让我们能够开始用 Elasticsearch 搜索数据。 用不了多长时间,就会发现我们想要的更多:希望查询匹配更灵活,排名结果更精确,不同问题域下搜索更具体。
HLee
2021/03/19
4.5K0
ElasticSearch权威指南:深入搜索(上)
ElasticSearch-查询
Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:
yuanshuai
2023/11/17
2600
ElasticSearch-查询
ES 复合查询
  ES在查询过程中比较多遇到符合查询,既需要多个字段过滤也需要特殊情况处理,本文简单介绍几种查询组合方便快捷查询ES。
用户1217611
2020/06/19
5.5K0
【ES三周年】分布式搜索索引elasticsearch JavaAPI编写ES搜索
在昨天的学习中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。
小小程序员
2023/04/28
1.5K0
【ES三周年】分布式搜索索引elasticsearch JavaAPI编写ES搜索
触类旁通Elasticsearch:打分
使得ES查询与select * from users where name like 'bob%'查询不同的是其为文档赋予相关性得分的能力。从这个得分,可以得知文档和原始的查询有多么相关。
用户1148526
2019/05/25
2K0
Elasticsearch 常用基本查询
安装启动很简单,参考官网步骤:https://www.elastic.co/downloads/elasticsearch
用户7353950
2022/05/10
7290
Elasticsearch 6.x版本全文检索学习之Search API
  方式一、GET /_search,对es中所有的数据进行查询。   方式二、GET /my_index/_search,针对单个索引的数据进行查询。   方式三、GET /my_index1,my_index2/_search,针对两个索引的数据进行查询。   方式四、GET /my_*/_search,指定索引查询,可以一次查询多个。
别先生
2019/11/03
1.4K0
Elasticsearch-05Elasticsearch之查询与过滤
当前版本 7.0 : https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
小小工匠
2021/08/17
1.2K0
ElasticSearch进阶篇之-Query DSL
ElasticSearch官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/getting-started-search.html
用户4919348
2022/04/13
7640
ElasticSearch进阶篇之-Query DSL
如何提高Elasticsearch搜索的相关性
首先需要了解什么是相关性?默认情况下,搜索返回的结果是按照 相关性 进行排序的,也就是最相关的文档排在最前。相关性是由一个所谓的打分机制决定的,每个文档在搜索过程中都会被计算一个_score字段,这是一个浮点数类型,值越高表示分数越高,也就是相关性越大。
用户7634691
2021/03/18
1K0
5年+ Elasticsearch 电商实战经验深度复盘
回顾自己过去的5年,从一名后端开发工程师,自我摸索、学习、探究,成为一名搜索开发工程师。复盘总结自己经历过的搜索的三个阶段,可简要概括为:(1)关键词搜索、(2)相关性搜索、(3)探索式搜索。
铭毅天下
2022/02/09
1.8K0
5年+ Elasticsearch 电商实战经验深度复盘
初识 Elasticsearch7.x(二)
REST 即表述性状态传递(英文:Representational State Transfer,简称 REST)是 Roy Fielding 博士在2000年他的博士论文中提出来的一种软件架构风格。REST 是一种规范。即参数通过封装后进行传递,响应也是返回的一个封装对象。一个 REST 的接口就像如下的接口:
Remember_Ray
2022/01/08
2.9K0
相关推荐
实战 | Elasticsearch自定义评分的N种方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验