内容简介:说明:本文章使用的ES版本是:在上一篇文章接下来我们具体的看一下ES中,搜索过程是怎样的
前言
说明:本文章使用的ES版本是: 6.7.0
在上一篇文章 Elasticsearch如何创建索引? 中,介绍了ES写入文档的过程。
接下来我们具体的看一下ES中,搜索过程是怎样的
在ES中搜索
按照前面几篇文章的步骤,我们直接开始debug搜索的过程。 上一篇文章 中我们写入了如下的数据
{ "id":6, "title": "我是文件标题,可被搜索到66", "text": "文本内容,ES时如何索引一个文档的66", "date": "2014/01/06" }'
现在执行如下请求,对ES服务器发起搜索请求:
curl -X GET 'localhost:9200/index_name/type_name/_search?pretty&q=title:66' -H 'Content-Type: application/json'
搜索可以接收下面的形式的请求:
客户端
- 根据上图的路由表,选取处理请求的Action,这里是RestSearchAction接收并开始处理请求
- RestSearchAction解析并验证搜索参数,并将其封装成SearchRequest,并指定服务端要处理该请求的Action:indices:data/read/search
服务端(master节点)
-
根据SearchRequest的index构造相应的ShardsIterator(分片迭代器),shardIterators由localShardsIterator(当前节点分片迭代器(默认一个节点上,一个索引有5个分片))和remoteShardIterators(其他节点分片迭代器)合并而成,根据搜索条件,构建搜索策略。然后遍历所有的shard。
-
搜索策略
- 最多遍历分片数量LONG最大值2^63-1
- 如果只有一个分片,搜索类型只能是:QUERY_THEN_FETCH
- 是否查询缓存
- 遍历分片的最大并发数Math.min(256, Math.max(节点数, 1)*节点分片数),节点默认分片数:5
-
- 构造异步请求Action,将请求转发到各个节点,等待回调
- 遍历所有节点,构造节点查询参数ShardSearchTransportRequest对象,对每个节点执行查询操作
- 执行查询阶段,首先在cache里面判断是否有缓存,如果有则执行缓存查询;如果cache里面没有,执行QueryPhase类的execute()方法,他调用lucene的searcher.search对索引进行查询,查询成功回调onShardResult方法并返回docIds,查询失败回调onShardFailure(计数失败情况,并尝试在副本分片上进行查询)
- 查询阶段会计算文档的相关性得分用于排序:
- Fetch阶段:master接收到各个节点返回的docIds后,发起数据Fetch请求,通过docId和其分片ID到对应分片抓取数据,后合并数据返回给客户端
大致的查询时序逻辑:
搜索总结
- Query阶段可以知道,一个搜索会遍历这个索引下的所有分片,每个分片都会执行一次搜索,并返回相同数量的文档ID。比如搜索条件要查询5条数据,有5个分片,则最终会查询25条数据,排序后取前面5条数据
- 查询和计算权重得分在Lucene完成,聚合是在ES中实现的
- 搜索会遍历所有的分片,所以分片的数量影响着搜索的性能,而分片的数量也决定了ES能承载的最大数据量。所以在具体的应用中,需要在二者之间选择平衡
- 计算文档权重得分,每搜索一次,都会根据搜索条件重新计算一次,对搜索性能影响很大
后面的文章中将会详细分析ES中的 排序 得分是如何计算的。
以上所述就是小编给大家介绍的《Elasticsearch搜索过程详解》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python学习手册
Mark Lutz / 侯靖 / 机械工业出版社 / 2009-8 / 89.00元
《Python学习手册(第3版)》讲述了:Python可移植、功能强大、易于使用,是编写独立应用程序和脚本应用程序的理想选择。无论你是刚接触编程或者刚接触Python,通过学习《Python学习手册(第3版)》,你可以迅速高效地精通核心Python语言基础。读完《Python学习手册(第3版)》,你会对这门语言有足够的了解,从而可以在你所从事的任何应用领域中使用它。 《Python学习手册(......一起来看看 《Python学习手册》 这本书的介绍吧!