Elasticsearch倒排索引与文档添加原理(一)

2024-04-21 18:58

本文主要是介绍Elasticsearch倒排索引与文档添加原理(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 相关文章
    • 一、 倒排索引
    • 二、segment
    • 三、 ES添加文档的流程
    • 四、 创建倒排索引(refresh)
    • 五、 flush
    • 六、文档

相关文章

一、 倒排索引

虽然你可能对倒排索引非常熟悉了,但是这里还是想重新反思一下。

思考:我们通过搜索引擎搜索一个关键字,搜索引擎怎样查找它抓取到的那些文档中包含这个关键字。

要去遍历所有文档吗?显然不现实,所以一种新的数据结构倒排索引出现。

term数据
hellodoc1-3-2-0-5,doc2-1-3-1-6
worlddoc1-3-2-0-5,doc2-1-3-1-6
Elasticsearchdoc5-3-2-0-5,doc9-1-3-1-6

如上所示,算是一个简化版本的倒排索引结构,它的数据中包含文档号、词频、位置和偏移量。

例如,上面的倒排索引显示hello这个单词:
在doc1这个文档中出现了3次,出现在第2个单词,这个单词在文档中从第0个字节开始,第5个字节结束。
在doc2这个文档中出现了1次,出现在第3个单词,这个单词在文档中从第1个字节开始,第6个字节结束。

同理,对应world、Elasticsearch以及其他关键词也一样。

这样当我们搜索hello这个单词的时候,我们可以很容易的知道哪些文档中包含有hello这个单词。当然实际情况会复杂很多,因为会有多个节点包含多个倒排索引。

在ES中我们可以通过mapping的index_option参数来控制倒排索引中包含哪些属性(文档号、词频、位置、偏移量)

二、segment

segment是ES的倒排索引,它的特别之处在于不会被修改,只会被合并和删除。

后面我们会介绍,每一次refresh都会产生一个segment,这些segment最终被保存到磁盘称为一个文件。

每一个segment都会占用文件句柄,更加重要的是每一个搜索请求都必须访问每一个segment,这就意味着存在的segment越多,消耗内存、cpu越多,搜索请求就会变的更慢。

所以,ES会在后台有一个合并segment的任务,下面是控制segment合并的一些参数:

参数说明
index.merge.policy.floor_segment默认2MB,小于该值的segment优先被合并
index.merge.policy.max_merge_at_once默认10,一次最多合并多少segment
index.merge.policy.max_merged_segment默认5GB,超过该值的segment不合并
index.merge.policy.max_merge_at_once_explicit显式调用一次最多合并多少个segment

三、 ES添加文档的流程

添加文档流程

添加文档的时候并不会直接解析,而是先添加到index-buffer,默认会一秒钟使用refresh处理一次,把文档解析为segment存放在filesystem cache中。

然而segment并不会马上写入磁盘,而是根据flush配置策略落盘,后面会详细介绍refresh与flush。

添加文档的时候另一个重要步骤就是写translog,因为文档到segment是有时间差的,并且segment也并不会马上写磁盘,所以先写translog保证数据不丢失。

当然如果translog是异步写,也可能会丢失部分数据。

translog是文件,因为顺序写,而且不出来数据,所以比较快

四、 创建倒排索引(refresh)

refresh就是将document解析为segment的过程,在ES中数据会从index-buffer到filesystem-cache的过程。

文档解析过程

refresh过程:

  1. 将index-buffer中的文档写入一个新的segment中
  2. 打开segment,以便于文档能够被搜索到
  3. 清除index-buffer中的文档

五、 flush

flush操作主要是内存中filesystem cache的segment落盘。

flush操作的流程:

  1. 将index-buffer中的文档写入一个新的segment中
  2. 清除index-buffer中的文档
  3. 往磁盘里写入commit point信息
  4. 将filesystem cache中的segment使用fsync写到磁盘
  5. 删除旧的translog文件

下面是一些控制flush操作的参数:

参数说明
index.translog.flush_threshold_ops多少次操作时执行一次flush,默认是unlimited
index.translog.flush_threshold_sizetranslog大小达到此值时flush,默认是512mb
index.translog.flush_threshold_period在该时间内至少有一次flush,默认是30m
index.translog.interval多少时间间隔内会检查一次translog大小,默认是5s

六、文档

index-buffer

translog

这篇关于Elasticsearch倒排索引与文档添加原理(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923810

相关文章

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

MySQL逻辑删除与唯一索引冲突解决方案

《MySQL逻辑删除与唯一索引冲突解决方案》本文探讨MySQL逻辑删除与唯一索引冲突问题,提出四种解决方案:复合索引+时间戳、修改唯一字段、历史表、业务层校验,推荐方案1和方案3,适用于不同场景,感兴... 目录问题背景问题复现解决方案解决方案1.复合唯一索引 + 时间戳删除字段解决方案2:删除后修改唯一字

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

浅谈mysql的not exists走不走索引

《浅谈mysql的notexists走不走索引》在MySQL中,​NOTEXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引,下面就来介绍一下mysql的notexists走不走索... 在mysql中,​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下