了解Lucene的细分合并

时间:2018-08-13 07:33:19

标签: elasticsearch merge lucene segment

我们有以下情形:

  1. 弹性搜索基于Lucene。
  2. 1400万份文档的索引基线(批索引)
  3. 每周删除约2万份文档,并重新索引或更新约3万份文档。通过Bulk-API分批编制2000个文档。

首先,我们处理文档的删除,然后出现更新。 仅供参考,有可能发生,我们删除了一个文档,该文档将在几分钟后再次被更新程序索引。

我现在的问题: 如果ES将某个文档(ID:D123)标记为已在段中删除(请说A),但是随后将具有相同ID(ID:D123)的文档索引到另一个段(B)中,则该文档应该是可搜索的。但是,如果段合并发生了怎么办?

段B将合并到段A中,其中包含相同文档ID(ID:D123)的删除标志。

合并后,文档中是否仍然具有删除标志? 我知道,如果某个段被合并,则删除的文档不会合并。但是,合并发生哪种方式有关系吗? 将A细分为B或将B细分为A?

在这种情况下,我们丢失了一些文档,但仍然找不到原因。

对于短期解决方案,我过滤掉重新建立索引后要删除的文档。

我想了解整个过程。 似乎根本不一致!

谢谢

1 个答案:

答案 0 :(得分:0)

Lucene的部门合并是指创建一个具有先前部门内容的新部门,但没有删除或过时的文档。因此,以您的示例为例,将创建一个新的分段C,其中包含分段A和B中的内容,顺序,但会过滤掉新分段中已删除的文档。而且,每个提交都会创建一个新的段,并且它们具有世代(1、2,...)。因此,每个段都是两次提交之间的时间间隔的快照,在合并过程中先读取B然后读取A是没有意义的,因为同一文档的插入+删除操作不是可交换的,我们将在时间上“向后” 。因此,您可以通过删除并插入具有相同ID的新文档来有效地更新文档ID:D123。 Lucene的索引中并没有真正的更新:它是一个删除操作,然后是一个插入操作。