本文档深入探讨了Elasticsearch的查询原理,包括单个ID查询文档和多个ID查询文档的流程。在搜索查询方面,通过两阶段查询,首先在各个分片拷贝中搜索匹配的文档标识符,然后在协调节点合并结果并获取完整文档。此外,全文检索的执行流程也得到了详细解释,从分析器处理查询词到构建查询语法树、匹配文档、评分和排序等步骤,分析其复杂的工作流程。
本文的介绍使用三节点的集群配置,索引分片配置为7.x版本默认的一主一副
Elasticsearch中的查询主要分为两类,Get请求:通过ID查询特定Doc;Search请求:通过Query查询匹配Doc。
例如:当 ES客户端 将 单文档id Get请求发送到节点 2 时,节点 2 将作为协调节点来处理查询请求。由于哈希取模运算确定了文档所在的分片为 shard3,因此查询流程如下:
所以,查询流程如下:
ES客户端 -> Node 2 (协调节点) -> Node 3 (数据节点) -> Node 2 (协调节点) -> ES客户端
对于 mget
请求,Elasticsearch 客户端会一次性发送多个文档ID,并且在协调节点(这里是节点 2)进行路由和汇总查询结果。
多文档ID查询(mget
请求)的流程:
协调节点处理:节点 2(协调节点)接收到 mget
请求后,会根据每个文档ID的哈希值确定对应的分片。
分片路由:协调节点会根据每个文档ID的哈希值确定其所在的分片,并将查询请求路由到负责相应分片的节点上。
并行查询:每个数据节点接收到查询请求后,并行地搜索相应的文档。每个节点将同时处理其负责的文档ID的查询请求。
结果汇总:每个数据节点将查询结果返回给协调节点。
结果返回:协调节点收到来自数据节点的查询结果后,会将它们汇总并返回给 Elasticsearch 客户端。
进行全文检索前,先回顾一下索引文档时的如何对全文进行分析处理
建立索引的过程中,对全文数据进行分析在Elasticsearch(ES)中通过分词组件和语言处理组件来完成。作用包括:
完成分析后,将分析器输出的词传递给索引组件,生成倒排索引和正排索引,并将其存储到文件系统中。
下面图示参考:https://blog.csdn.net/weixin_41947378/article/details/109405386 3.6 创建索引流程总结
注意,以下表示一个es节点
在Elasticsearch中,配置分词器(Tokenizer)和语言处理组件(Token Filter)是通过创建或修改索引的分析器(Analyzer)来实现的。下面是一个简单的配置示例:
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
// 这里是自定义的分析器名称
"type": "custom", // 自定义分析器
"tokenizer": "standard", // 使用标准分词器作为分词器
"char_filter": ["remove_symbols"], // 使用字符过滤器去除无用符号
"filter": [
"lowercase", // 将所有词元转换为小写
"english_stop" // 停用词过滤器
]
}
},
"filter": {
"english_stop": {
// 停用词过滤器的配置
"type": "stop", // 停用词类型
"stopwords": "_english_" // 使用内置的英文停用词表
}
},
"char_filter": {
"remove_symbols": {
"type": "mapping",
"mappings": ["=>", ",", ".", "!"] // 需要移除的符号列表
}
}
}
}
}
要应用此配置,可以在创建索引时指定该分析器,或者在已有索引上修改分析器配置。例如:
{
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "my_analyzer" // 指定使用自定义分析器
}
}
}
}
当文档的content
字段被索引时,将会使用my_analyzer
分析器进行文本分析和处理。
Query Then Fetch的搜索类型在文档相关性打分的时候参考的是本分片的数据,这样在文档数量较少的时候可能不够准确,DFS Query Then Fetch增加了一个预查询的处理,询问Term和Document frequency,这个评分更准确,但是性能会变差。
分析器(Analyzer)处理查询词:首先,针对查询语句中的检索词,使用相同的分析器进行分析。分析器会将查询词拆分成词项(Tokens),这与建立索引时的处理方式相同。
构建查询语法树:根据查询语句的语法规则,将其转换成一棵语法树。这棵语法树描述了查询的逻辑结构,包括查询条件之间的逻辑关系以及操作符的作用。
匹配文档:根据语法树,在索引中查找符合查询条件的文档。这一步涉及到倒排索引的使用,根据词项快速定位匹配的文档。
评分:对匹配到的文档列表进行相关性评分。评分策略通常使用 **TF/IDF(词频-逆文档频率)或 BM25(BM25算法)**等算法,根据查询词项在文档中的出现频率、在索引中的逆文档频率等因素计算文档的相关性分数。
排序:根据评分结果,对匹配到的文档列表进行排序。相关性分数高的文档排在前面,以便用户首先看到最相关的结果。
1.算分逻辑的步骤
Elasticsearch的算分逻辑是基于文档的相关性评分,通常使用**TF/IDF(词频-逆文档频率)或BM25(BM25算法)**等算法来计算。在搜索查询中,算分逻辑可以简单概括为以下几个步骤:
词项匹配度计算:首先,根据查询语句中的词项在文档中的出现频率(TF)以及在整个索引中的逆文档频率(IDF),计算每个词项的匹配度得分。
字段权重计算:对于查询语句中的每个字段,可以为其指定不同的权重,以反映字段在整个查询中的重要性。字段权重可以通过配置或者默认值进行设置。
文档长度归一化:由于文档长度可能不同,需要对匹配到的文档进行长度归一化,以确保长文档和短文档在得分计算中公平竞争。
评分公式计算:根据算分模型(如TF/IDF或BM25)以及以上步骤得到的各项参数,计算文档的最终相关性得分。这个得分可以综合考虑词项匹配度、字段权重、文档长度等因素。
结果排序:最后,根据得分对匹配到的文档进行排序,通常相关性得分高的文档排在前面,以便用户首先看到最相关的结果。
2.TF/IDF模型和BM25算法的区别
TF/IDF模型和BM25算法都是用于信息检索领域的相关性评分模型,它们在计算文档相关性时有一些区别:
基本原理:
权重计算:
文档长度考虑:
适用性:
[1] ES详解 - 原理:ES原理之读取文档流程详解 | Java 全栈知识体系 (pdai.tech)
[2] ElasticSearch 基本原理之全文检索_elasticsearch全文检索原理-CSDN博客
[3] ElasticSearch查询流程详解 - 掘金 (juejin.cn)
[4] 执行分布式检索 | Elasticsearch: 权威指南 | Elastic
本文如有错漏之处,烦请私信或者指出
更多【django-Elasticsearch进阶篇(二):Elasticsearch查询原理】相关视频教程:www.yxfzedu.com