[ElasticSearch2.x]原理之分布式搜索

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 这个要比基本的创建-读取-更新-删除(CRUD)请求要难一些。CRUD操作是处理的单个文档。这就意味着我们明确的知道集群中的哪个分片存储我们想要的文档。

这个要比基本的创建-读取-更新-删除(CRUD)请求要难一些。CRUD操作是处理的单个文档。这就意味着我们明确的知道集群中的哪个分片存储我们想要的文档。

一个 CRUD 操作只对单个文档进行处理,文档有唯一的组合,由 _index_type, 和 路由值 (默认是该文档的 _id )组成。 这表示我们确切的知道此文档在集群中哪个分片中。

搜索请求是更复杂的执行模型,因为我们不知道哪些文档会与查询匹配,它们可能存在在集群中的任意一个分片中。一个搜索请求不得不搜索我们关注的一个或多个索引中的每个分片拷贝(主分片或者副本分片),以查看分片中中是否有匹配的文档。

但找到所有匹配到文档只是完成了一半工作.在searchAPI返回一“页”结果之前,来自多个分片的结果必须聚合成单个排序的列表。 因此,搜索在两阶段过程中执行,queryfetch

1. Query阶段

在初始化查询阶段(query phase),查询将广播到索引中的每个分片的拷贝上(主分片或者副本分片)。每个分片在本地执行搜索并且建立了匹配文档的优先队列(priority queue)。

1.1 优先级队列

优先级队列priority queue 只是一个存有前n个(top-n)匹配文档的有序列表。优先级队列的大小取决于fromsize分页参数。 例如,以下搜索请求将需要足够大的优先级队列来容纳100个文档:

GET /_search
{
    "from": 90,
    "size": 10
}

1.2 Query

Query阶段过程如下图所示:

image

Query阶段包含如下步骤:

(1) 客户端发送一个Search请求给节点 3,节点 3 创建了一个长度为from+size的空优先级队列。

(2) 节点3将搜索请求转发到索引中每个分片的一个主分片或副本分片上( forwards the search request to a primary or replica copy of every shard in the index)。 每个分片在本地执行查询,并将结果添加到大小为from+size的本地排序的优先级队列中。

(3) 每个分片将其优先级队列中的所有文档的文档ID和排序值返回给协调节点节点3,节点3将这些值合并到其自己的优先级队列中,以生成全局排序的结果列表。

当一个搜索请求被发送到一个节点,这个节点就变成了协调节点。这个节点的工作是向所有相关的分片广播搜索请求并且把它们的响应整合成一个全局的有序结果集。将这个结果集返回给客户端。

第一步是将请求广播到索引里每个节点的一个主分片或者副本分片上(broadcast the request to a shard copy of every node in the index)。就像document的GET请求一样,搜索请求可以被主分片或者任意副本分片处理。所以说更多的副本能够更高效的提高搜索。协调节点将在之后的请求中轮询所有的分片拷贝来分摊负载。

每一个分片在本地执行查询和建立一个长度为from+size的有序优先级队列——这个长度意味着它自己的结果数量就足够满足全局的请求要求。分片返回一个轻量级的结果列表给协调节点。只包含文档ID值和排序需要用到的值,例如_score。

协调节点将这些分片结果合并到其自己的排序优先级队列中,表示全局排序的结果集。 到此查询阶段结束。

备注

索引可以由一个或多个主分片组成,因此针对单个索引的搜索请求需要能够组合来自多个分片的结果。 搜索多个或所有索引的工作方式完全相同 - 只是会涉及更多的分片。

2. Fetch 阶段

查询阶段标示出哪些文档满足我们的搜索请求,我们只返回了文档ID以及对排序有用的值,并没有返回文档本身。们仍然需要检索那些文档。这就是fetch阶段的工作,过程如下图所示:

image

分发阶段由以下步骤构成:

(1) 协调节点标示出哪些文档需要取回,并且向相关分片发出GET请求。

(2) 如果需要,每个分片加载文档,然后将文档返回协调节点。

(3) 一旦所有的文档都被取回,协调节点将结果返回给客户端。

协调节点首先决定哪些文档是实际需要取回的。例如,如果我们查询指定{ "from": 90, "size": 10 },那么前90条结果将会被丢弃,只需要检索接下来的10个结果。这些文档可能来自与查询请求相关的一个、多个或者全部分片。

协调节点给拥有相关文档的每个分片创建一个multi-get request,并发送请求给同样处理查询阶段的分片拷贝。

分片加载文档体-- _source字段--如果有需要,用metadatasearch snippet highlighting丰富结果文档。 一旦协调节点接收到所有的结果文档,它就组合这些结果为单个响应返回给客户端。

原文:https://www.elastic.co/guide/en/elasticsearch/guide/current/distributed-search.html

https://www.elastic.co/guide/en/elasticsearch/guide/current/_query_phase.html

https://www.elastic.co/guide/en/elasticsearch/guide/current/_fetch_phase.html

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
1月前
|
存储 搜索推荐 数据挖掘
ElasticSearch架构介绍及原理解析
ElasticSearch架构介绍及原理解析
98 0
|
3月前
|
NoSQL Java 测试技术
字节二面:Spring Boot Redis 可重入分布式锁实现原理?
字节二面:Spring Boot Redis 可重入分布式锁实现原理?
160 1
|
3月前
|
自然语言处理 API 索引
Elasticsearch Analyzer原理分析并实现中文分词
Elasticsearch Analyzer原理分析并实现中文分词
74 0
|
3月前
|
监控 Dubbo Java
深入理解Zookeeper系列-2.Zookeeper基本使用和分布式锁原理
深入理解Zookeeper系列-2.Zookeeper基本使用和分布式锁原理
58 0
|
2月前
|
存储 数据采集 监控
SkyWalking全景解析:从原理到实现的分布式追踪之旅
SkyWalking全景解析:从原理到实现的分布式追踪之旅
323 1
|
24天前
|
设计模式 安全 Java
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
27 0
|
3月前
|
存储 安全 JavaScript
【分布式技术专题】「授权认证体系」深度解析OAuth2.0协议的原理和流程框架实现指南(授权流程和模式)
在传统的客户端-服务器身份验证模式中,客户端请求服务器上访问受限的资源(受保护的资源)时,需要使用资源所有者的凭据在服务器上进行身份验证。资源所有者为了给第三方应用提供受限资源的访问权限,需要与第三方共享它的凭据。这就导致一些问题和局限:
373 2
【分布式技术专题】「授权认证体系」深度解析OAuth2.0协议的原理和流程框架实现指南(授权流程和模式)
|
3月前
|
NoSQL 中间件 API
分布式锁【数据库乐观锁实现的分布式锁、Zookeeper分布式锁原理、Redis实现的分布式锁】(三)-全面详解(学习总结---从入门到深化)(下)
分布式锁【数据库乐观锁实现的分布式锁、Zookeeper分布式锁原理、Redis实现的分布式锁】(三)-全面详解(学习总结---从入门到深化)
81 2
|
3月前
|
NoSQL Java API
分布式锁【数据库乐观锁实现的分布式锁、Zookeeper分布式锁原理、Redis实现的分布式锁】(三)-全面详解(学习总结---从入门到深化)(上)
分布式锁【数据库乐观锁实现的分布式锁、Zookeeper分布式锁原理、Redis实现的分布式锁】(三)-全面详解(学习总结---从入门到深化)
73 0
|
24天前
|
缓存 算法 关系型数据库
深度思考:雪花算法snowflake分布式id生成原理详解
雪花算法snowflake是一种优秀的分布式ID生成方案,其优点突出:它能生成全局唯一且递增的ID,确保了数据的一致性和准确性;同时,该算法灵活性强,可自定义各部分bit位,满足不同业务场景的需求;此外,雪花算法生成ID的速度快,效率高,能有效应对高并发场景,是分布式系统中不可或缺的组件。
深度思考:雪花算法snowflake分布式id生成原理详解