ES的Search流程过程理解

GET操作只能对单个文档进行处理,由_index、_type和_id三元组来确定唯一文档。但搜索需要一种更复杂的模型,因为不知道查询会命中哪些文档。

找到匹配文档仅仅完成了搜索流程的一半,因为多分片中的结果必须组合成单个排序列表。集群的任意节点都可以接收搜索请求,接收客户端请求的节点称为协调节点。在协调节点,搜索任务被执行成一个两阶段过程,即query then fetch。真正执行搜索任务的节点称为数据节点。

需要两个阶段才能完成搜索的原因是,在查询的时候不知道文档位于哪个分片,因此索引的所有分片(某个副本)都要参与搜索,然后协调节点将结果合并,再根据文档ID获取文档内容。例如,有5个分片,查询返回前10个匹配度最高的文档,那么每个分片都查询出当前分片的TOP 10,协调节点将5×10 = 50的结果再次排序,返回最终TOP 10的结果给客户端。

一个简单的搜索请求示例如下:

GET  http://127.0.0.0:9200/_search?q=惠科&pretty

{
	"took": 2,
	"timed_out": false,
	"_shards": {
		"total": 1,
		"successful": 1,
		"skipped": 0,
		"failed": 0
	},
	"hits": {
		"total": {
			"value": 1,
			"relation": "eq"
		},
		"max_score": 1.3791525,
		"hits": [
			{
				"_index": "secisland",
				"_type": "_doc",
				"_id": "1",
				"_score": 1.3791525,
				"_source": {
					"count": 100,
					"detail": "HKC/惠科 23.8英寸 IPS面板 高清屏幕 低蓝光不闪屏",
					"id": "10000",
					"name": "惠科显示器",
					"price": 1099
				}
			}
		]
	}
}

在上面的例子中,我们从所有字段搜索“first”关键词,返回信息中几个基本字段的含义如下:

· took代表搜索执行时间(单位:毫秒);
· total代表本次搜索命中的文档数量;
· max_score为最大得分,代表文档匹配度;
· hits为搜索命中的结果列表,默认为10条。

索引和搜索

ES中的数据可以分为两类:精确值和全文。

· 精确值,比如日期和用户id、IP地址等。
· 全文,指文本内容,比如一条日志,或者邮件的内容。

这两种类型的数据在查询时是不同的:
    ·对精确值的比较是二进制的,查询要么匹配,要么不匹配;
    ·全文内容的查询无法给出“有”还是“没有”的结果,它只能找到结果是“看起来像”你要查询的东西,因此把查询结果按相似度排序,评分越高,相似度越大。

对数据建立索引和执行搜索的原理如下图所示。

在这里插入图片描述

建立索引

如果是全文数据,则对文本内容进行分析,这项工作在 ES 中由分析器实现。分析器实现如下功能:

    · 字符过滤器。主要是对字符串进行预处理,例如,去掉HTML,将&转换成and等。

    · 分词器(Tokenizer)。将字符串分割为单个词条,例如,根据空格和标点符号分割,输出的词条称为词元(Token)。

    · Token过滤器。根据停止词(Stop word)删除词元,例如,and、the等无用词,或者根据同义词表增加词条,例如,jump和leap。

    · 语言处理。对上一步得到的Token做一些和语言相关的处理,例如,转为小写,以及将单词转换为词根的形式。语言处理组件输出的结果称为词(Term)。

分析完毕后,将分析器输出的词(Term)传递给索引组件,生成倒排和正排索引,再存储到文件系统中。

执行搜索

搜索调用Lucene完成,如果是全文检索,则:

    · 对检索字段使用建立索引时相同的分析器进行分析,产生Token列表;

    · 根据查询语句的语法规则转换成一棵语法树;

    · 查找符合语法树的文档;

    · 对匹配到的文档列表进行相关性评分,评分策略一般使用TF/IDF;

    · 根据评分结果进行排序。

search type

ES目前有两种搜索类型:

· DFS_QUERY_THEN_FETCH;

· QUERY_THEN_FETCH(默认)

两种不同的搜索类型的区别在于查询阶段,DFS查询阶段的流程要多一些,它使用全局信息来获取更准确的评分。

分布式搜索过程

我们分析默认搜索类型。按照请求涉及的节点来分析流程,搜索流程涉及两个节点:协调节点和数据节点。

一个搜索请求必须询问请求的索引中所有分片的某个副本来进行匹配。

假设一个索引有5个主分片,每个主分片有1个副分片,共10个分片,一次搜索请求会由5个分片来共同完成,它们可能是主分片,也可能是副分片。也就是说,一次搜索请求只会命中所有分片副本中的一个。

当搜索任务执行在分布式系统上时,整体流程如下图所示。

在这里插入图片描述

协调节点流程

两阶段相应的实现位置:查询(Query)阶段—search.InitialSearchPhase;取回(Fetch)阶段—search.FetchSearchPhase。

它们都继承自SearchPhase,如下图所示:

在这里插入图片描述

Query阶段

在初始查询阶段,查询会广播到索引中每一个分片副本(主分片或副分片)。每个分片在本地执行搜索并构建一个匹配文档的优先队列。

优先队列是一个存有topN匹配文档的有序列表。优先队列大小为分页参数from + size。

分布式搜索的Query阶段(图片来自官网)如下图所示:

在这里插入图片描述

QUERY_THEN_FETCH搜索类型的查询阶段步骤如下:

1.客户端发送search请求到NODE 3。

2.Node 3将查询请求转发到索引的每个主分片或副分片中。

3.每个分片在本地执行查询,并使用本地的Term/Document Frequency信息进行打分,添加结果到大小为from + size的本地有序优先队列中。

4.每个分片返回各自优先队列中所有文档的ID和排序值给协调节点,协调节点合并这些值到自己的优先队列中,产生一个全局排序后的列表。

协调节点广播查询请求到所有相关分片时,可以是主分片或副分片,协调节点将在之后的请求中轮询所有的分片副本来分摊负载。

查询阶段并不会对搜索请求的内容进行解析,无论搜索什么内容,只看本次搜索需要命中哪些shard,然后针对每个特定shard选择一个副本,转发搜索请求。

Query阶段源码分析

执行本流程的线程池:http_server_work

1. 解析请求

在RestSearchAction#prepareRequest方法中将请求体解析为SearchRequest数据结构:

2. 构造目的shard列表

将请求涉及的本集群shard列表和远程集群的shard列表(远程集群用于跨集群访问)

3. 遍历所有shard发送请求

请求是基于shard遍历的,如果列表中有N个shard位于同一个节点,则向其发送N次请求,并不会把请求合并为一个。

转发请求同时定义一个Listener,用于处理Response,发送过程依然调用transport模块实现。

4. 收集返回结果

在search线程池中执行,onShardSuccess对收集到的结果进行合并。

Fetch阶段

Query阶段知道了要取哪些数据,但是并没有取具体的数据,这就是Fetch阶段要做的。

分布式搜索的Fetch阶段(图片来自官网)如下图所示:

在这里插入图片描述

Fetch阶段由以下步骤构成:

1.协调节点向相关NODE发送GET请求。

2.分片所在节点向协调节点返回数据。

3.协调节点等待所有文档被取得,然后返回给客户端。

分片所在节点在返回文档数据时,处理有可能出现的_source字段和高亮参数。协调节点首先决定哪些文档“确实”需要被取回,例如,如果查询指定了{ "from":90, "size":10 },则只有从第91个开始的10个结果需要被取回。为了避免在协调节点中创建的number_of_shards * (from + size)优先队列过大,应尽量控制分页深度。

Fetch阶段是通过文档ID获取完整的文档内容,前面的Query阶段只会简单的返回文档ID。

执行本流程的线程池:search。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
方案是为解决特定问题或达成特定目标而制定的一系列计划或步骤。它的作用是提供一种系统性的方法,以有效地应对挑战、优化流程或实现目标。以下是方案的主要作用: 问题解决: 方案的核心目标是解决问题。通过系统性的规划和执行,方案能够分析问题的根本原因,提供可行的解决方案,并引导实施过程,确保问题得到合理解决。 目标达成: 方案通常与明确的目标相关联,它提供了一种达成这些目标的计划。无论是企业战略、项目管理还是个人发展,方案的制定都有助于明确目标并提供达成目标的路径。 资源优化: 方案在设计时考虑了可用资源,以最大化其效用。通过明智的资源分配,方案可以在有限的资源条件下实现最大的效益,提高效率并减少浪费。 风险管理: 方案通常会对潜在的风险进行评估,并制定相应的风险管理策略。这有助于减轻潜在问题的影响,提高方案的可行性和可持续性。 决策支持: 方案提供了决策者所需的信息和数据,以便做出明智的决策。这种数据驱动的方法有助于减少不确定性,提高决策的准确性。 团队协作: 复杂的问题通常需要多个人的协同努力。方案提供了一个共同的框架,帮助团队成员理解各自的职责和任务,促进协作并确保整个团队朝着共同的目标努力。 监控与评估: 方案通常包括监控和评估的机制,以确保实施的有效性。通过定期的评估,可以及时调整方案,以适应变化的环境或新的挑战。 总体而言,方案的作用在于提供一种有序、有计划的方法,以解决问题、实现目标,并在实施过程中最大化资源利用和风险管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值