elasticsearch - 为什么lucene的段是不可变的
问题描述
众所周知,当在elasticsearch中更新或删除文档的内容时,segment并不是立即删除,而是新创建的。
在那之后,我们知道段是通过时间表合并的。
我知道它这样工作的原因是因为它很贵。
但是我不知道为什么段是不可变的并且不立即合并的确切原因。
即使我搜索文档,也找不到确切的原因,但如果有人知道这一点,请发表评论。
谢谢你。
解决方案
拥有不可变的段提供了很多好处,例如
- 它可以在多线程环境中轻松使用,因为内容是不可更改的,当您拥有可变内容时,您不必担心共享状态和竞争条件以及很多复杂性。
- 它可以被有效地缓存,因为缓存快速变化的数据集会破坏缓存的目的。
请参阅以下来自官方 ES 文档的内容,了解为什么lucene 段是缓存友好的
Lucene 旨在利用底层操作系统来缓存内存中的数据结构。Lucene 段存储在单独的文件中。因为段是不可变的,所以这些文件永远不会改变。这使它们对缓存非常友好,并且底层操作系统很乐意将热段保留在内存中以便更快地访问。这些段包括倒排索引(用于全文搜索)和文档值(用于聚合)。
另请参阅一般不可变数据的好处以获取更多详细信息。
推荐阅读
- java - 何时将活动传递给另一个类会导致内存泄漏?
- c++ - Vulkan --- vkAcquireNextImageKHR 在使用某些队列族时抛出 std::out_of_range
- circleci - 找不到更改日志,因为没有给出版本代码 - 请指定:version_code
- r - 从 exec 目录执行脚本
- javascript - 将参数从 Vue 发送到 Laravel 控制器以更新道具
- odoo-13 - ir.actions.act_window 中的 src_model 在哪里?
- linux - 如何在 Ubuntu 上运行 Kotlin?
- java - 如何将自定义 jar 文件添加到 pom.xml
- mysql - 有没有办法使用 ER 图作为数据库模式?如果是,我该如何使用它?
- .net - dotnet restore:排除项目