资讯专栏INFORMATION COLUMN

Elasticsearch搜索过程详解

Reducto / 2312人阅读

摘要:所以在具体的应用中,需要在二者之间选择平衡计算文档权重得分,每搜索一次,都会根据搜索条件重新计算一次,对搜索性能影响很大系列文章搜索引擎源码编译和环境搭建搜索引擎的启动过程创建索引流程搜索过程详解搜索相关性排序算法详解中的倒排索引

前言

说明:本文章使用的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"

搜索可以接收下面的形式的请求:

客户端

根据路由,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能承载的最大数据量。所以在具体的应用中,需要在二者之间选择平衡

计算文档权重得分,每搜索一次,都会根据搜索条件重新计算一次,对搜索性能影响很大

系列文章

搜索引擎ElasticSearch源码编译和Debug环境搭建

搜索引擎ElasticSearch的启动过程

Elasticsearch创建索引流程

Elasticsearch搜索过程详解

Elasticsearch搜索相关性排序算法详解

Elasticsearch中的倒排索引

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/34529.html

相关文章

  • Elasticsearch搜索相关性排序算法详解

    摘要:接下来我们具体的看一下搜索时,是如何计算文档相关性得分并用于排序的。系列文章搜索引擎源码编译和环境搭建搜索引擎的启动过程创建索引流程搜索过程详解搜索相关性排序算法详解中的倒排索引参考资料 前言 说明:本文章使用的ES版本是:6.2.4 在上一篇文章Elasticsearch搜索过程详解中,介绍了ES的搜索过程。 接下来我们具体的看一下ES搜索时,是如何计算文档相关性得分并用于排序的。 ...

    MSchumi 评论0 收藏0
  • 搜索引擎ElasticSearch源码编译安装和Debug环境搭建

    摘要:本地代码使用在本地调试,有两种方式,一种是直接在上运行进行调试,但需要很多繁杂得配置。系列文章搜索引擎源码编译和环境搭建搜索引擎的启动过程创建索引流程搜索过程详解搜索相关性排序算法详解中的倒排索引 环境准备 说明:本文章使用的ES版本是:6.7.0 JDK Elastisearch 6.7.0编译需要JDK版本10.0及以上,我直接安装了JDK12.JDK下载地址:https://ww...

    Blackjun 评论0 收藏0
  • Elasticsearch中的倒排索引

    摘要:本篇文章主要介绍中的索引倒排索引分词在创建索引之前,会对文档中的字符串进行分词。简单来说,索引就是实现单词文档矩阵的具体数据结构,而倒排索引则是实现了这种数据结构的具体方式。 前言 再Elasticsearch创建索引流程一文中,介绍了ES创建索引的流程。再流程中是调用Lucene的接口来创建索引的。本篇文章主要介绍ES中的索引——倒排索引 分词 在创建索引之前,会对文档中的字符串进行...

    frank_fun 评论0 收藏0
  • Elasticsearch创建索引流程

    摘要:前言说明本文章使用的版本是在上一篇文章搜索引擎的启动过程中,介绍了的启动过程。由此可知,在启动过程中,创建对象时,初始化了,由其名字可以知道这是用来处理请求的。主分片写入后,即可搜索。 前言 说明:本文章使用的ES版本是:6.7.0 在上一篇文章搜索引擎ElasticSearch的启动过程中,介绍了ES的启动过程。 由此可知,在ES启动过程中,创建Node对象(new Node(env...

    mudiyouyou 评论0 收藏0
  • elasticsearch概念详解

    摘要:本文主要介绍的一些基本概念,有助于深入理解研究和系统一图胜千言与参照来看添加一条数据紫色箭头所指向的为名称红色箭头所指向的为名称参数后面的整个串为一条数据黄色箭头所指向的串的部分为字段名称蓝色箭头所指向的串的部分为字段值顾名思义,集群由一 本文主要介绍elasticsearch6.0的一些基本概念,有助于深入理解、研究elasticsearch和elk系统 一图胜千言 elastics...

    Airy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<