《深入理解Elasticsearch(原书第2版)》一2.4.4 后置过滤和过滤查询

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介:

本节书摘来华章计算机《深入理解Elasticsearch(原书第2版)》一书中的第2章 ,第2.4.4节,[美]拉斐尔·酷奇(Rafal Ku) 马雷克·罗戈任斯基(Marek Rogoziski)著 张世武 余洪淼 商旦 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.4.4 后置过滤和过滤查询
如果某人说过滤比实现相同功能的查询执行更快,这不一定是真的。的确,过滤器需要考虑的东西更少,并且可以在后续查询中复用,不过Lucene早就针对查询做了高度优化,以确保查询能够高速执行,甚至在考虑文档评分的情境下。当然,如果匹配结果数量极多,过滤器会执行得更快一些。不过,还有一些事我们没有告诉你。某些时候,在使用后置过滤(post_filter)时,Elasticsearch查询的执行速度没有我们期望的那么快。假如我们执行如下查询:
image

下图展示了查询的执行过程:

image


当然,针对大量数据的过滤是很有价值的。不过在本例中,我们使用现有的少量数据。从上图可见,索引中包含4个文档。例子中的terms查询匹配了3个文档:Doc1、Doc3和Doc4。每个匹配的文档都被计算得分并根据得分做了排序。之后,post_filter开始工作。在索引的所有文档中,它只通过了两个文档:Doc1和Doc4。可以看到,一共传递给过滤器3个文档,而只有其中的两个被作为结果输出。既然如此,还有必要对Doc3计算得分吗?本例我们浪费了一部分CPU时间来计算一个最终不匹配的文档的得分。如果类似的文档数量很多,这将是一个性能问题。
 本例中我们使用了term过滤器。该过滤器在Elasticsearch 1.5版本之前都是默认缓存的。而从1.5版本开始,默认不再缓存(参考https://github.com/Elasticsearch/Elasticsearch/pull/7583)。因此,我们在例子中使用term过滤器时特意使用了强制缓存。
让我们修改一下这个查询,让文档过滤操作发生在Scorer计算文档得分之前。修改后的查询如下:
image
image

在这里我们使用了过滤查询(filtered query)。返回的查询结果和前一个查询一模一样,不过执行过程稍微有一些变化,特别是在执行过滤操作时。下图揭示了这个查询在理论上的执行过程:

image


现在,最初的工作是由term过滤器完成的。如果这个过滤器在之前被使用过,它将从缓存中加载,整个文档集合将被筛成只剩两个文档。最后,这两个文档仍然需要被计算得分,不过评分模块需要做的工作少了一些。当然,本例中,查询和过滤后的文档相匹配,不过这一点并非在所有查询场景下都满足。
从技巧上看,我们让过滤器被一个查询所包裹,让Lucene库能够只收集被过滤通过的结果。当然,过滤通过的结果还需要被传递给主查询做进一步处理。多亏了过滤器,打分程序需要处理的文档数量减少了。

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
9月前
|
数据采集 JSON 数据挖掘
Elasticsearch 的DSL查询,聚合查询与多维度数据统计
Elasticsearch的DSL查询与聚合查询提供了强大的数据检索和统计分析能力。通过合理构建DSL查询,用户可以高效地搜索数据,并使用聚合查询对数据进行多维度统计分析。在实际应用中,灵活运用这些工具不仅能提高查询效率,还能为数据分析提供深入洞察。理解并掌握这些技术,将显著提升在大数据场景中的分析和处理能力。
444 20
|
存储 JSON 监控
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
791 4
|
存储 自然语言处理 关系型数据库
Elasticsearch 查询时 term、match、match_phrase、match_phrase_prefix 的区别
【7月更文挑战第3天】Elasticsearch 查询时 term、match、match_phrase、match_phrase_prefix 的区别
|
JSON 自然语言处理 算法
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
DSL查询文档、RestClient查询文档、全文检索查询、精准查询、复合查询、地理坐标查询、分页、排序、高亮、黑马旅游案例
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
|
自然语言处理 搜索推荐 Java
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(一)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图
308 0
|
存储 自然语言处理 搜索推荐
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
277 0
|
自然语言处理 Java 关系型数据库
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
421 1
|
存储 数据库 索引
面试题ES问题之动态映射的定义如何解决
面试题ES问题之动态映射的定义如何解决
152 1
|
自然语言处理 索引
Elasticsearch 常用查询语句大全
【7月更文挑战第8天】Elasticsearch 常用查询语句大全
|
索引
Elasticsearch 精确查询:术语查询、多术语查询、主键查询、范围查询、存在查询、前缀查询、正则查询与通配符查询
Elasticsearch 精确查询:术语查询、多术语查询、主键查询、范围查询、存在查询、前缀查询、正则查询与通配符查询
249 4