首页 > 其他分享 >ElasticSearch系列-索引原理与数据读写流程

ElasticSearch系列-索引原理与数据读写流程

时间:2023-10-03 20:25:31浏览次数:37  
标签:buffer translog 读写 索引 ElasticSearch file segment mit

索引原理

倒排索引

倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引。通俗地来讲,正向索引是通过key找value,反向索引则是通过value找key。ES底层在检索时底层使用的就是倒排索引。

索引模型

现有索引和映射如下:

{
  "products" : {
    "mappings" : {
      "properties" : {
        "description" : {
          "type" : "text"
        },
        "price" : {
          "type" : "float"
        },
        "title" : {
          "type" : "keyword"
        }
      }
    }
  }
}

先录入如下数据,有三个字段title、price、description等

_id title price description
1 蓝月亮洗衣液 19.9 蓝月亮洗衣液高效
2 iphone13 19.9 不错的手机
3 小浣熊干脆面 1.5 小浣熊好吃

在ES中除了text类型分词,其他类型不分词,因此根据不同字段创建索引如下:

  • title字段:

    term _id(文档id)
    蓝月亮洗衣液 1
    iphone13 2
    小浣熊干脆面 3
  • price字段

    term _id(文档id)
    19.9 [1,2]
    1.5 3
  • description字段

    term _id term _id term _id
    1 2 3
    1 2 3
    1 2 3
    1 2 3
    1 2 3
    1        
    [1:1:9,2:1:6,3:1:6]        
    1        
    1        

注意: Elasticsearch分别为每个字段都建立了一个倒排索引。因此查询时查询字段的term,就能知道文档ID,就能快速找到文档。

数据写入流程

  1. 先写入buffer,在buffer里的时候数据是搜索不到的;同时将数据写入translog日志文件

  2. 如果buffer快满了,或者到一定时间,就会将buffer数据refresh到一个新的segment file中,但是此时数据不是直接进入segment file的磁盘文件的,而是先进入os cache的。这个过程就是refresh。为什么叫es是准实时的?NRT,near real-time,准实时。默认是每隔1秒refresh一次的,所以es是准实时的,因为写入的数据1秒之后才能被看到。

  3. 只要数据进入os cache,此时就可以让这个segment file的数据对外提供搜索了
  4. 重复1~3步骤,新的数据不断进入buffer和translog,不断将buffer数据写入一个又一个新的segment file中去,每次refresh完buffer清空,translog保留。随着这个过程推进,translog会变得越来越大。当translog达到一定长度的时候,就会触发mit操作。
  5. mit操作发生第一步,就是将buffer中现有数据refresh到os cache中去,清空buffer

  6. 将一个mit point写入磁盘文件,里面标识着这个mit point对应的所有segment file

  7. 强行将os cache中目前所有的数据都fsync到磁盘文件中

  8. 将现有的translog清空,然后再次重启启用一个translog,此时mit操作完成。默认每隔30分钟会自动执行一次mit,但是如果translog过大,也会触发mit。整个mit的过程,叫做flush操作。我们可以手动执行flush操作,就是将所有os cache数据刷到磁盘文件中去。
    es中的flush操作,就对应着mit的全过程。我们也可以通过es api,手动执行flush操作,手动将os cache中的数据fsync强刷到磁盘上去,记录一个mit point,清空translog日志文件。
  9. translog其实也是先写入os cache的,默认每隔5秒刷一次到磁盘中去,所以默认情况下,可能有5秒的数据会仅仅停留在buffer或者translog文件的os cache中,如果此时机器挂了,会丢失5秒钟的数据。但是这样性能比较好,最多丢5秒的数据。也可以将translog设置成每次写操作必须是直接fsync到磁盘,但是性能会差很多。
  10. 如果是删除操作,mit的时候会生成一个.del文件,里面将某个doc标识为deleted状态,那么搜索的时候根据.del文件就知道这个doc被删除了

  11. 如果是更新操作,就是将原来的doc标识为deleted状态,然后新写入一条数据

  12. buffer每次refresh一次,就会产生一个segment file,所以默认情况下是1秒钟一个segment file,segment file会越来越多,此时会定期执行merge

  13. 每次merge的时候,会将多个segment file合并成一个,同时这里会将标识为deleted的doc给物理删除掉,然后将新的segment file写入磁盘,这里会写一个mit point,标识所有新的segment file,然后打开segment file供搜索使用,同时删除旧的segment file。

es里的写流程,有4个底层的核心概念,refresh、flush、translog、merge

当segment file多到一定程度的时候,es就会自动触发merge操作,将多个segment file给merge成一个segment file。

图片

数据查询流程

  1. 客户端发送请求到任意一个node,成为coordinate node

  2. coordinate node对document进行路由,将请求转发到对应的node,此时会使用round-robin随机轮询算法,在primary  shard以及其所有replica中随机选择一个,让读请求负载均衡

  3. 接收请求的node返回document给coordinate node

  4. coordinate node返回document给客户端

图片

 

作者|悦@arcstack

 

标签:buffer,translog,读写,索引,ElasticSearch,file,segment,mit
From: https://www.cnblogs.com/88223100/p/ElasticSearch-Series---Indexing-Principles-and-Data-Rea

相关文章

  • stata 18 显示r603 不能安装外部命令 主要是设置文件夹的读写权限
    1.stata18安装位置的ado文件夹中新建plus personal ......
  • springboot整合elasticsearch中的分词查询配置
    前言:elasticsearch最好还是在linux中进行集群部署,这样更符合企业需求和规范,笔者只在windows的单节点9200端口上部署,仅用于测试和学习。 什么是分词查询: 指的是将输入的文本或查询语句切分成一个个独立的词语或词项,以便更好地处理和分析,然后进行查询,比如你在百度上搜索”成都......
  • 笨办法学Python3 习题16 读写文件
    知识点:a_txt=open(file_a)         #默认只读模式打开文件file_a,赋值变量a_txt,后面好执行读取命令b_txt=open(file_b,"w")      #以write写入模式打开文件file_b,赋值变量b_txt//还有"r"只取模式,"a"追加模式a_txt_r=a_txt.rea......
  • driverindexer 是一个用于管理Windows系统驱动程序的工具。它被用于创建、修改和维护W
    driverindexer是一个用于管理Windows系统驱动程序的工具。它被用于创建、修改和维护Windows操作系统的驱动程序索引。驱动程序索引是一个记录系统中所有已安装驱动程序信息的数据库。它包含了驱动程序的名称、文件路径、版本号等详细信息。Windows系统通过查询驱动程序索引来查......
  • ElasticSearch的安装部署-----图文介绍
    文章目录背景什么是ElasticSearch使用场景ElasticSearch的在linux环境下的安装部署前期准备分配权限(正式实操)启动ElasticSearch创建用户组创建用户,并设置密码用户添加到elasticsearch用户组指定用户操作目录的一个操作权限切换用户解压elasticsearch修改es的配置文件修改jvm.opt......
  • Go每日一库之140:Zinc(轻量级搜索引擎)
    ‍项目介绍Zinc是一个轻量级替代Elasticsearch的开源搜索引擎。Elasticsearch真的好用,但是Elasticsearch安装和配置也是真的繁琐,后续的一些维护也有一定成本。另外一个Elasticsearch的不足就是服务运行起来需要的计算资源较多,对于普通的用户来说是有点浪费的。Zinc,拥有......
  • 【日常收支账本】【Day03】通过ElementTree+XPath实现对XML文件的读写
    一、项目地址https://github.com/LinFeng-BingYi/DailyAccountBook二、新增1.解析xml文件1.1功能详述解析所设计的xml文件格式,并将所得数据存入变量。点击查看xml格式<DailyAccountBook><balance><fund><value>5000.00</value>......
  • ElasticSearch笔记
    一、常用查询关键字1、matchmatch是模糊匹配查询,根据分词器(如果创建mapping没有指定分词器,Es将会采取默认的分词器:standard,standard分词将会把匹配的词组分成单个的字,而不是短语)将指定的query查询的语句进行分词匹配。#查询索引中name为Tom的文档:{'query':{......
  • PG的表和索引的膨胀
    大家好,这次大表哥给大家分享的是PG的表和索引的膨胀。首先,为什么会出现表和索引的膨胀?总所周知,PostgresSQL实现的MVCC的机制不同于oracle,mysqlinnodb的undotablespace的机制。表上所用的更新和删除等操作的行为,都不会实际的删除或修改,而是标记为死元祖(deadrowsor......
  • MySQL InnoDB什么时候更新索引的统计信息?
    MySQLInnoDB的索引统计信息在什么时候更新呢?或者说什么事件会触发InnoDB索引的统计信息更新呢?下面结合参考资料WhenDoesInnoDBUpdatetheIndexStatistics?(DocID1463718.1)[1]简单总结梳理一下(文中大部分知识点来自参考资料)。1:ANALYZETABLE命令ANALYZETABLE命令会......