Elaticsearch 6.8 算分介绍

简介: - 前段时间写多项式算分插件,发现 ES 的算分概念还是挺多的,主要有 Query, Weight, Scorer。本文简单介绍一下,不过还有一些细节看得也不清晰,如果有错,欢迎斧正 ### 查询流程概览 - 首先看下 ES 的查询流程 - HTTP 收到请求,按 Shard 分发到 Data - Data 按 shard 查询结束后,发往 http merge, 然后再发往
  • 前段时间写多项式算分插件,发现 ES 的算分概念还是挺多的,主要有 Query, Weight, Scorer。本文简单介绍一下,不过还有一些细节看得也不清晰,如果有错,欢迎斧正

查询流程概览

  • 首先看下 ES 的查询流程

    • HTTP 收到请求,按 Shard 分发到 Data
    • Data 按 shard 查询结束后,发往 http merge, 然后再发往 Data fetch
    • 算分便是发生在 lucene:search (org.apache.lucene.search.IndexSearcher#search) 中

算分过程

  • 算分整体分为四步

    1. 从 Query 依次按层构建 Weight
    2. 从 Weight 构建 BulkScorer
    3. 从 BulkScorer 构建 Scorer
    4. Collector 收集时用 Scorer 按文档打分,得到分数




从 Query Builder 到 Query

  • 熟悉 ES 的同学可能都知道我们写的查询在 ES 内部都是 QueryBuilder,那么 Query 是什么呢?又怎么从 QueryBuilder 转换到 Query 的呢?
  • QueryBuilder 为 ES 内部对象,用于和用户(XContent)以及集群间传递(Stream)。QueryBuilder 均有两个方法 toQuery , ToFilter 。 分别转为普通的 lucene Query 和不用算分的 lucene Query。不过 toFilter 目前基本无使用。大多 QueryBuilder 采用 AbstractQueryBuilder 实现,用户仅需实现自定义序列化反序列化及 doToQuery 即可
  • Query 为 lucene 内部对象, 用于 Lucene 中的查询,主要有两个核心方法, rewrite 和 createWeight

    • rewrite 将高阶 query 改写为基础 query,比如 fuzzy,prefix,query_string,regexp,wildcard,改写成 bool query 或者 bitset , 在 es 中也可使用 _validate/query?rewrite=true 直接看到改写结果

  • createWeight 则是构造用于查询的 Weight,在其中可以指定要不要算分,当不要算分时,有些 query 会进行改写,比如 bool query 会将 must 移入 filter。另外也只有不要算分时,weight 才会进缓存。

Weight 是什么

  • ES 文档中是这样描述的

The purpose of Weight is to ensure searching does not modify a Query, so that a Query instance can be reused.

  • 可见,Weight 最大的作用就是保存和 IndexSearcher 相关的状态,类似 Query 级的上下文,来保证 Query 的复用。 (不过没看出有对 Query 的复用?)
  • Weight 主要有4个核心方法,1个辅助方法

    • scorer 打分器

      • 传入一个 LeafReaderContext ,返回一个"打分器", 为什么加引号,详见下文介绍
    • bulkScorer

      • 批量打分器,search 调用的入口方法,方便在批量场景下做优化,比如二阶段查询加速,倒排链合并,大多数场景采用 DefaultBulkScorer
    • scorerSupplier

      • 可以在不够造 scorer 之前先判断一下 cost。不过默认的实现是先创建了个 scorer 然后取了其迭代器的 cost
    • extractTerms

      • 获得 query 中的 term,term query a:b, 则会获得b . dfs 和高亮时会用到,如未实现,则无法高亮。如 terms 当 term 数大于16时,则会走 TermInSetQuery 的 weight, 其未实现此方法,因此无法高亮
    • explain

      • 解释某篇 doc 命中/没命中及分数原因
    • matches

      • 判断某个 doc 有没有命中,如果有二阶段,则先用二阶段粗略判断一次。返回一个MatchesIterator 仅测试中用到

不单纯的 Scorer

  • Scorer 虽名为打分器,但实际由两部分组成,score 和 iterator,score 为真实打分逻辑,iterator 为命中 doc 的迭代器,也就是在生成 scorer 时才去查询了哪些 doc 命中,也因此即使无需算分时,也需要有 scorer 对象,仅是 score 方法返回固定值。
  • 那么 Scorer 和 相似性算分 Similarity 又是什么关系呢?

    • Similarity 的具体实现为 SimScorer, 其为 TermScorer 的一部分,在 termScorer 算分时会调用相似性算分

总结

  • 所以,总结一下,要实现一个算分需要怎么样呢?首先 QueryBuilder 转换时要用 toQuery, 然后 needsScores 为 true, 然后 bulkScorer 中给 collector 设置了 scorer, 最后在 Collector 中调用 score 方可完成算分。

参考资料

目录
相关文章
|
分布式计算 监控 搜索推荐
Elasticsearch之SearchScroll原理剖析和优化
Elasticsearch是一款优秀的开源企业级搜索引擎,其查询接口主要为Search接口,提供了丰富的各类查询、排序、统计聚合等功能。本文将要介绍的是另一个查询接口SearchScroll,同时介绍一下我们在这方面做的一些性能和稳定性等方面的优化工作。   Elasticsearch的SearchScroll接口可用于从索引中检索大量数据,或者是所有的数据,值得注意的是Elasti
5030 0
Elasticsearch之SearchScroll原理剖析和优化
|
4月前
|
存储 Kubernetes 容器
Kubernetes 存储选项:持久化卷与存储类
【8月更文第29天】随着容器化的普及,越来越多的应用程序需要持久化数据以保持状态信息。Kubernetes 提供了一套完整的解决方案来管理和配置持久化存储,包括持久卷 (Persistent Volume, PV)、持久卷声明 (Persistent Volume Claim, PVC) 和存储类 (StorageClass)。本文将详细介绍这些概念,并通过实际示例来演示如何在 Kubernetes 中配置存储。
376 1
|
18天前
|
SQL 存储 关系型数据库
SQL自学笔记(3):SQL里的DCL,DQL都代表什么?
本文介绍了SQL的基础语言类型(DDL、DML、DCL、DQL),并详细说明了如何创建用户和表格,最后推荐了几款适合初学者的免费SQL实践平台。
78 3
SQL自学笔记(3):SQL里的DCL,DQL都代表什么?
|
3月前
|
Rust API Python
Python Requests 库中的重试策略实践
在网络请求中,由于网络波动或服务暂时不可达等原因,请求可能失败。为增强客户端健壮性,自动重试机制变得尤为重要。本文介绍如何在 Python 的 `requests` 库中实现请求自动重试,通过 `urllib3` 的 `Retry` 类配置重试策略,并提供了一个具体示例,展示了如何设置重试次数、状态码集合及异常类型等参数,从而提高系统的可靠性和容错能力。
107 3
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能(AI)技术的发展史
人工智能 (AI) 的发展历程从20世纪50年代起步,历经初始探索、早期发展、专家系统兴起、机器学习崛起直至深度学习革命。1950年图灵测试提出,1956年达特茅斯会议标志着AI研究开端。60-70年代AI虽取得初步成果但仍遭遇困境。80年代专家系统如MYCIN展现AI应用潜力。90年代机器学习突飞猛进,1997年深蓝战胜国际象棋冠军。21世纪以来,深度学习技术革新了AI,在图像、语音识别等领域取得重大成就。尽管AI已广泛应用,但仍面临数据隐私、伦理等挑战。未来AI将加强人机协作、增强学习与情感智能,并在医疗、教育等领域发挥更大作用。
|
机器学习/深度学习 自然语言处理 搜索推荐
承上启下:基于全域漏斗分析的主搜深度统一粗排
两阶段排序(粗排-精排)一开始是因系统性能问题提出的排序框架,因此长期以来粗排的定位一直是精排的退化版本,业内的粗排的优化方向也是持续逼近精排。我们提出以全域成交的hitrate为目标的全新指标,重新审视了召回、粗排和精排的关系,指出了全新的优化方向
93780 3
|
Linux 网络安全 开发工具
Linux 安装git,并且使用https方式 git pull 代码的免密操作
Linux 安装git,并且使用https方式 git pull 代码的免密操作
407 0
|
存储 搜索推荐 数据建模
(下)原理都懂,就是不会建模?来,顶尖数据模型走一波
(下)原理都懂,就是不会建模?来,顶尖数据模型走一波
|
存储 缓存 自然语言处理
|
存储 机器学习/深度学习 算法
如何选择最佳的最近邻算法
如何选择最佳的最近邻算法
269 0
如何选择最佳的最近邻算法