我们都知道es是一个分布式的存储和检索系统,在存储的时候默认是根据每条记录的_id字段做路由分发的,这意味着es服务端是准确知道每个document分布在那个shard上的。
相对比于CURD上操作,search一个比较复杂的执行模式,因为我们不知道那些document会被匹配到,任何一个shard上都有可能,所以一个search请求必须查询一个索引或多个索引里面的所有shard才能完整的查询到我们想要的结果。
找到所有匹配的结果是查询的第一步,来自多个shard上的数据集在分页返回到客户端的之前会被合并到一个排序后的list列表,由于需要经过一步取top N的操作,所以search需要进过两个阶段才能完成,分别是query和fetch。
(一)query(查询阶段)
当一个search请求发出的时候,这个query会被广播到索引里面的每一个shard(主shard或副本shard),每个shard会在本地执行查询请求后会生成一个命中文档的优先级队列。
这个队列是一个排序好的top N数据的列表,它的size等于from+size的和,也就是说如果你的from是10,size是10,那么这个队列的size就是20,所以这也是为什么深度分页不能用from+size这种方式,因为from越大,性能就越低。
es里面分布式search的查询流程如下:
````
1,客户端发送一个search请求到Node 3上,然后Node 3会创建一个优先级队列它的大小=from+size
2,接着Node 3转发这个search请求到索引里面每一个主shard或者副本shard上,每个shard会在本地查询然后添加结果到本地的排序好的优先级队列里面。
3,每个shard返回docId和所有参与排序字段的值例如_score到优先级队列里面,然后再返回给coordinating节点也就是Node 3,然后Node 3负责将所有shard里面的数据给合并到一个全局的排序的列表。
````
上面提到一个术语叫coordinating node,这个节点是当search请求随机负载的发送到一个节点上,然后这个节点就会成为一个coordinating node,它的职责是广播search请求到所有相关的shard上,然后合并他们的响应结果到一个全局的排序列表中然后进行第二个fetch阶段,注意这个结果集仅仅包含docId和所有排序的字段值,search请求可以被主shard或者副本shard处理,这也是为什么我们说增加副本的个数就能增加搜索吞吐量的原因,coordinating节点将会通过round-robin的方式自动负载均衡。
(二)fetch(读取阶段)
query阶段标识了那些文档满足了该次的search请求,但是我们仍然需要检索回document整条数据,这个阶段称为fetch
流程如下:
````
1,coordinating 节点标识了那些document需要被拉取出来,并发送一个批量的mutil get请求到相关的shard上
2,每个shard加载相关document,如果需要他们将会被返回到coordinating 节点上
3,一旦所有的document被拉取回来,coordinating节点将会返回结果集到客户端上。
````
这里需要注意,coordinating节点拉取的时候只拉取需要被拉取的数据,比如from=90,size=10,那么fetch只会读取需要被读取的10条数据,这10条数据可能在一个shard上,也可能在多个shard上所以
coordinating节点会构建一个multi-get请求并发送到每一个shard上,每个shard会根据需要从_source字段里面获取数据,一旦所有的数据返回,coordinating节点会组装数据进入单个response里面然后将其返回给最终的client。
总结:
本文介绍了es的分布式search的查询流程分为query和fetch两个阶段,在query阶段会从所有的shard上读取相关document的docId及相关的排序字段值,并最终在coordinating节点上收集所有的结果数进入一个全局的排序列表后,然后获取根据from+size指定page页的数据,获取这些docId后再构建一个multi-get请求发送相关的shard上从_source里面获取需要加载的数据,最终再返回给client端,至此整个search请求流程执行完毕,至于为什么es要通过两个阶段来完成一次search请求而不是一次搞定,欢迎大家在评论区留言讨论。
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
分享到:
相关推荐
1. **Elasticsearch (ES)**:Elasticsearch是一个基于Lucene的分布式、全文搜索和分析引擎。它用于存储、搜索和分析大量结构化和非结构化数据,广泛应用于日志分析、实时分析、信息检索等领域。 2. **Chrome浏览器...
在本文中,我们将深入探讨如何使用Spring Boot与Elasticsearch 7.6.2进行基本操作,包括创建索引、添加...记住,Elasticsearch的强大还在于它的聚合分析、地理位置搜索等高级特性,这些都是进一步提升应用性能的关键。
**谷歌浏览器Elasticsearch...总的来说,这个谷歌浏览器Elasticsearch查询数据扩展组件简化了对Elasticsearch实例的访问流程,提高了工作效率,对于需要频繁进行Elasticsearch操作的用户来说,是一个非常实用的工具。
10. **大数据处理**: 作为大数据工具,Elasticsearch支持处理海量数据,可以快速响应复杂的查询,并通过横向扩展增加处理能力。 在实际应用中,用户可能需要结合Kibana(用于数据可视化)、Logstash(数据收集和...
Elasticsearch是一款开源的全文搜索引擎,广泛应用于日志分析、实时数据分析、网站搜索等多个领域。它基于Lucene库,但提供了更高级别的抽象和分布式特性,使得数据的存储、索引和检索变得更加简单高效。这份高清...
Elasticsearch Head插件为Elasticsearch的管理和监控提供了直观的图形界面,极大地简化了操作流程,尤其适合初学者和开发者使用。在大数据背景下,掌握这款工具对于提升数据处理效率和优化业务流程具有重要意义。...
2. **流程搜索**:通过Elasticsearch,用户可以快速搜索历史流程实例,查询特定任务的执行情况或找到符合特定条件的流程实例。 3. **智能推荐**:结合机器学习,Elasticsearch可以根据历史流程数据预测未来可能的...
这使得Elasticsearch更易于集成到已有的基于SQL的工作流程中,提高了开发效率和数据分析的便利性。 总之,Elasticsearch SQL插件2.4.3.0版本是一个非常实用的工具,它降低了Elasticsearch的学习曲线,增强了数据...
Elasticsearch数据导出工具是一种高效实用的解决方案,它允许用户方便地从Elasticsearch(ES)集群中抽取数据,并将其导出到不同的目标,如MySQL数据库或本地文件系统。这款工具尤其适用于需要进行数据迁移、备份或...
总结,Elasticsearch 8.1.2是适用于Windows x86_64环境的大数据搜索和分析引擎,其强大的功能和易用性使其成为大数据领域的热门选择。正确安装和配置Elasticsearch,结合其他Elastic Stack组件,可以帮助企业高效...
Elasticsearch是一款强大的开源搜索引擎,尤其适用于实时数据分析和大规模数据检索。这个压缩包"elasticsearch-7.8.1-windows-x86_64.zip"是专为Windows 64位系统设计的最新版本,提供了在Windows环境下运行Elastic...
3. **SQL 支持**:Elasticsearch 6.4.0 引入了对 SQL 查询语法的支持,使得熟悉 SQL 的用户能更容易地与 Elasticsearch 交互,提高了开发效率。 4. **机器学习功能**:该版本进一步增强了内置的机器学习功能,可以...
Elasticsearch,简称ES,是一款基于Lucene的分布式、RESTful搜索分析引擎,被广泛应用于日志分析、实时监控、数据搜索等领域。这本书旨在帮助读者从理论到实践全面掌握Elasticsearch的精髓。 首先,书中会介绍...
Elasticsearch 5.4.0 是一个流行的开源搜索引擎和分析引擎,广泛应用于大数据处理、日志分析、实时搜索和监控等场景。它基于 Lucene 库构建,提供了分布式、可扩展、近实时的搜索与分析功能。Maven 是 Java 项目管理...
**Elasticsearch 数据查询 SQL 知识点详解** 在大数据时代,Elasticsearch 作为一款高性能、可...通过熟练掌握 Elasticsearch SQL,开发者可以更好地利用 Elasticsearch 的强大功能,解决各种数据查询和分析的需求。
本项目是针对Elasticsearch 5.x版本的Java工具类,旨在简化与SpringBoot集成时的开发流程,通过封装常用API和自定义注解,实现开箱即用的功能。 首先,让我们深入理解Elasticsearch的Java API。Elasticsearch提供了...
6. 搜索功能:Elasticsearch 支持丰富的查询语法,包括布尔查询、短语查询、范围查询、模糊查询等。同时,它还提供了聚合功能,可以进行数据汇总、统计分析,如计数、平均值、最大值、最小值等。 7. 自动发现与恢复...
使用Kettle连接ES插件的优势在于,它允许你在ETL流程中灵活地处理数据转换,如数据清洗、格式转换等,然后再批量导入到Elasticsearch。这使得Kettle能够充分发挥其数据处理能力,并与Elasticsearch的强大搜索和分析...
4. **搜索与查询**:提供一个交互式的查询界面,用户可以输入Lucene查询语法或者使用Elasticsearch的Query DSL进行查询,查看搜索结果并分析查询性能。 5. **节点监控**:插件能够显示每个节点的详细信息,如内存...
Elasticsearch Sense广泛应用于数据分析、日志分析、搜索引擎优化等领域,特别适合开发人员调试Elasticsearch查询、测试索引结构以及性能调优。它也适用于需要频繁与Elasticsearch交互的系统管理员,帮助他们快速...