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

相关文章

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J