ElasticSearch创建文档以及索引文档的详细流程

这篇具有很好参考价值的文章主要介绍了ElasticSearch创建文档以及索引文档的详细流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        当我们发起一个查询请求之后,ES是怎么处理这个请求然后返回数据的呢?今天就来详细说一下。

首先看一下整体结构:

ElasticSearch创建文档以及索引文档的详细流程

 

        在集群模式下一个索引有多个分片,在上图中有三个节点(一个主节点两个从节点),一个索引被分为两个分片(P0、P1),每个主分片有两个副本分片(R0,R1),每个主分片底层都是对应一个Lucene Index(Lucenne索引在前面文章已经解释过,可以往回翻翻),Lucene 索引由多个Segment组成(就是段文件),每个段存储的就是文档了。

 当我们想要添加一个文档的流程是怎样的呢?

        首先ES在接受到这个请求之后,会通过路由策略来确定需要把文档存储在哪一个shard中去,然后节点接受到请求后就会交由底层的Lucene来处理了。

        Lucene Index会准备待索引的原文档,然后对原文档进行分词处理,形成一系列的term(词条),然后索引组件对文档和term处理,形成字典和倒排表。这样一个文档基本就被创建好了。

如果是搜索文档的话又是怎样处理的呢?

        Lucene首先会对语句进行分词处理,形成一系列的term。然后根据倒排索引表查找出包含term的文档,并进行合并形成返回结果。最后对查询语句与各个文档的相关性进行评分,最后按分的高低顺序返回结果。

ElasticSearch创建文档以及索引文档的详细流程

 

 ElasticSearch语法分析器:

        我们在进行搜索的时候,ES是怎么进行分词的?分析过程是:

  1. 将文本分成适合倒排索引的独立词条
  2. 将词条统一化为标准格式提高他们的可搜索性。

完成上面的功能主要靠三个东西:

  • 字符过滤器:字符串按顺序一个个通过字符过滤器,主要是为了处理一些特殊字符,比如说将&转为and。
  • 分词器:分词器将字符串分为单个的词条。
  • Token过滤器:将分词器分析出来的词条挨个处理,可能会改变词条(大小写转换),删除无用的词条处理等等...

ES写入文档的详细流程: 


1.当用户发起请求后,首先请求会来到master节点,然后通过文档的id来计算对应的分片,然后再发由相应的节点来处理。

2.当分片所在节点接收到请求后,会把请求先写入Memory Buffer(这个时候数据还没到segment,还搜不到这个文档)。然后每隔1s写入倒File Cache。这个过程叫Refresh。

3.Refresh过程:默认是每隔1s将Memory Buffer的数据写入到File Cache。Segment是存储在文件系统的缓存中的。所以此时文档是可以被搜到的了。refresh后文档存储在文件系统缓存中,这样就避免了性能IO又可以被搜到,refresh默认一秒,为了提高性能可以稍微延长这个时间间隔,比如5s,所以es是准实时,达不到真正的实时。

4.为了防止数据丢失,ES通过Translog来保证数据不会丢失。就是在接收到请求后,数据同时也会写入translog中,当Filesystem Cache中的数据写入到磁盘中之后,这里面的数据才会被清除。这个过程叫flush。

5.文档在文件系统缓存中可能会有意外情况导致文档丢失,需要将文档写入磁盘,将文档从文件缓存系统写入磁盘的过程就叫flush,写入磁盘后translog就会被清空。

flush过程如下:

(1)缓冲区的文档都被写入到一个新的段,然后缓冲区会被清空。

(2)一个commit point被写入硬盘。

(3)文件系统缓存通过fsync被刷新。

(4)老的translog被删除。

ElasticSearch创建文档以及索引文档的详细流程 

merge段

每个文档到FileCache都会创建一个新的段,段太多了怎么办?merge过程:

前面说过,在Lucene Index中每次刷新都会产生一个新的段,那么段会越来越多。每一个段都会文件句柄、内存和CPU运行周期,所以段越多那么搜索也会越慢。所以ES会在后台通过Merge Segment来解决这个问题。

当索引的时候Refresh操作会创建一个新的段并且将段打开以供搜索使用。这时候后台的合并进程选择一部分大小相似的段,然后将它合并到更大的段当中,这并不会中断索引和搜索。当合并结束之后,老的段就会被删除:新的段(指合并之后的段)就会被刷新到磁盘,新的段被打开用来搜索,老的段被删除。

注意:合并大的段需要消耗大量的i/o和CPU资源,如果仍其发展会影响搜索性能。ES默认情况下会对合并流程进行资源控制,所以搜索仍然有足够的资源很好的执行。

分布式的写入流程 

在ES中一般一个索引都会被设置为多个shard,通过路由规则将数据分为多个数据子集,每个数据子集提供独立的索引和搜索功能。在写入文档的时候也会根据路由规则(默认通过id),将文档发给特定的shard进行处理,这样就实现了分布式。

通过前面介绍我们知道了,当数据写入之后一般不会立即写入磁盘而是在File Cache的Lucene Index中,这时候数据还没有写入磁盘中,那么有个问题就是这时候机器宕机内存中的数据就会丢失。这时候如何保证?我们前面也就知道是通过trans log。

  • 在每个shard中,写入就被分为两步,就是先写Lucene 在写translog。
  • 意思就是写入请求到达shard后,先写Lucene文件,再写translog文件,然后刷新translog到磁盘上,磁盘写入成功之后请求返回给用户。
  • 这里为什么会先写lucene文件再写translog文件?原因可能就是Lucen的内存写入会有很复杂的逻辑容易失败,比如超时分词等,为了避免translog中有大量的无效记录,所以就放在前面了。写入Lucene内存后并不是马上就可以被搜索到了,需要refresh把内存中的对象转换为segment后,才可以被搜索到。
  • 每隔一段较长的时间,Lucene会把内存中的新Segment刷到磁盘,然后索引文件就把持久化了,translog就没用了,就会被删掉。

更新文档

ES的不支持部分字段的更新,更新都是将整个文档更新,流程如下:

  • 收到更新请求后会先从Segment或者translog中读取出完整的文档,记录版本号为V1。
  • 然后将请求中的部分要更新的字段和读取出来的文档组合成新的完整的文档,同时更新内存中的Version Map。
  • 然后再从version Map中读取该id的最大版本号V2,如果version map中没有,则从segment或者translog中读取一下,这里基本都会从versionMap中读取出来。
  • 检查版本是否冲突,如果冲突了就会回退重新执行,如果不冲突就会执行新的add请求。
  • 然后将文档doc写入到Lucene中吗,回删除相同id的文档,然后再将这个文档写入进去。
  • 释放锁

ElasticSearch创建文档以及索引文档的详细流程 

读取文档流程


        搜索一般都是分两阶段的,首先是匹配文档id,第二步是在根据文档id查找对应的文档id,有点类似mysql的索引回表过程。

1.在初始化查询阶段,查询会广播到索引中的每一个分片拷贝。每个分片在本地执行搜索并构建一个匹配文档的大小为from+size的优先级队列。

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

3.接下来协调节点辨别出那些文档需要被取回并且向相关的分片提交多个GET请求,每个分片加载文档一旦所有文档都被取回,协调节点返回结果给客户端。

        我们知道在Es集群中一般一个索引会被分为多个shard,每个shard在不同的node中,而且每个shard一般还会有副本,增加数据的可靠性。那么在查询的时候会从主节点或者副本节点任意选一个来进行查询。在处理一个查询请求的时候首先需要查询所有的shard(同一个shard的primary和replica任选一个即可)。每一个shrad都是一个独立的搜索引擎,然后返回最匹配的TOP10的结果。然后返回给协调节点,协调节点收集所有的shard的返回结果,然后通过优先级队列二次排序,选择top10的结果,然后再通过id去取完整的文档,然后返回给用户。

        上面所说的先根据查询请求取找到合适的id,然后在通过id去取完成的文档这中两阶段的查询在ES中称为query_then_fetch,还有一种一阶段就返回完整doc的称为query_and_fetch,但是一般一阶段就返回文档的适用于只需查询一个shard的请求。文章来源地址https://www.toymoban.com/news/detail-430164.html

到了这里,关于ElasticSearch创建文档以及索引文档的详细流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用kibana来创建ElasticSearch的索引库与文档的命令

    本篇博客主要以介绍使用kibana来创建ElasticSearch的索引库与文档的命令语句 操作 效果 创建索引表 查询(索引)表结构 修改(索引)表结构 删除表结构 操作 效果 插入文档 修改文档 查询文档 检索文档 删除文档 |

    2024年01月18日
    浏览(65)
  • elasticsearch[一]-索引库操作(轻松创建)、文档增删改查、批量写入(效率倍增)

    在 elasticsearch 提供的 API 中,与 elasticsearch 一切交互都封装在一个名为 RestHighLevelClient 的类中,必须先完成这个对象的初始化,建立与 elasticsearch 的连接。 分为三步: 1)引入 es 的 RestHighLevelClient 依赖: 2)因为 SpringBoot 默认的 ES 版本是 7.6.2,所以我们需要覆盖默认的 ES 版本

    2024年01月16日
    浏览(61)
  • 【ElasticSearch】基于 Java 客户端 RestClient 实现对 ElasticSearch 索引库、文档的增删改查操作,以及文档的批量导入

    ElasticSearch 官方提供了各种不同语言的客户端,用来操作 ES。这些客户端的本质就是组装 DSL 语句,通过 HTTP 请求发送给 ES 服务器。 官方文档地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html。 在本文中,我们将着重介绍 ElasticSearch Java 客户端中的 RestClient,并演示如何

    2024年02月08日
    浏览(49)
  • 【ElasticSearch】基于Docker 部署 ElasticSearch 和 Kibana,使用 Kibana 操作索引库,以及实现对文档的增删改查

    Elasticsearch 和 Kibana 是强大的工具,用于构建实时搜索和数据可视化解决方案。Elasticsearch 是一个分布式、高性能的搜索引擎,可以用于存储和检索各种类型的数据,从文本文档到地理空间数据。Kibana 则是 Elasticsearch 的可视化工具,用于实时分析和可视化大规模数据集。 在本

    2024年02月06日
    浏览(83)
  • [golang gin框架] 38.Gin操作Elasticsearch创建索引、修改映射、数据CURD以及数据分页

    常见的 Golang 操作 ElasticSearch 的插件主要有下面两个: 第三方插件: github.com/olivere/elastic 官网插件 github.com/elastic/go-elasticsearch 其中 elastic 比 go-elasticsearch 文档更全面一些,start 量也更多一些,本节讲解 elastic 使用第三方库 https://github.com/olivere/elastic 来连接 ES 并进行操作 注意

    2024年02月09日
    浏览(63)
  • ELK(Elasticsearch、Kibana、Logstash)以及向ES导入mysql数据库数据或CSV文件数据,创建索引和可视化数据

    地址:Past Releases of Elastic Stack Software | Elastic 在Products和version处分别选择需要下载的产品和版本,E(elasticsearch)L(logstash)K(kibana)三者版本必须相同 将下载好的elk分别解压到相同路径下 本文中elasticsearch=E=ES=es;L=logstash;K=kibana 一般情况下使用默认配置即可,下面对我的

    2024年02月15日
    浏览(59)
  • elasticsearch基础1——索引、文档

    导航: 【黑马Java笔记+踩坑汇总】JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 黑马旅游源码:  https://wwmg.lanzouk.com/ikjTE135ybje 目录 1.初识弹性搜索elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 1.1.2.ELK弹性栈 1.1.3.elasticsearch和lucene 1.1.4.搜索引擎技术

    2023年04月08日
    浏览(47)
  • Elasticsearch索引与文档

    在Elasticsearch中,索引和文档是REST接口操作的最基本资源。索引一般是以索引名称出现在REST请求操作的资源路径上,而文档则是以文档ID为标识出现在资源路径中。除了这两种资源,映射类型_doc也可以认为是一种资源。但在Elasticsearch 7 废除映射类型的大背景下,_doc已经越来

    2023年04月19日
    浏览(45)
  • Elasticsearch的索引库和文档操作、RestClient的索引库和文档操作

    Linux系统通过Docker安装Elasticsearch、部署kibana Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,并管理和监控堆栈。 简单的说

    2024年02月04日
    浏览(46)
  • elasticsearch索引、文档、映射等概念

    1、文档(document) 文档是存储在Elasticsearch中的一个JSON格式的字符串。它就像在关系数据库中表的一行。每个存储在索引中的一个文档都有一个类型和一个ID,每个文档都是一个JSON对象,存储了零个或多个字段或键值对。原始的JSON文档被存储在一个叫做_source的字段中,当搜

    2023年04月17日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包