如何粘合(合并)Lucene 文件?

问题描述 投票:0回答:1

我将 Apache Lucene 集成到 Spring Boot 应用程序中(这是我的第一次体验),一切都很好,但我看到一堆文件 - 索引:.cfs .si .cfe;如果我计划在索引中达到 10 亿个文件,如何组合它们以及是否有必要这样做?

<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    <version>9.8.0</version>
</dependency>

为了将新数据添加到索引,我编写了下一个简单的方法:

synchronized public void addToIndex(IndexData data) {
    Document doc = setDocument(data.id, data.body, data.coutry);
    try {
        writer.addDocument(doc);
        writer.commit();
        writer.maybeMerge();
        writer.flush();
        doc.clear();
    } catch (IOException e)
    { e.printStackTrace();}
}

该方法位于单例类中,并配置了 IndexWriter:

config.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
调用“maybeMerge()”是否足够,因为 Lucene 在需要时会自行合并文件?

java spring lucene
1个回答
0
投票

底线:

如果您没有遇到特定问题,那么关于 Lucene 如何自动管理段合并,您可能不需要更改任何内容。


更多注意事项:

是的,Lucene 索引目录将包含“一堆文件” - 请参阅 Apache Lucene - 索引文件格式 了解概述。

相关文件组形成,其中:

每个段都是一个完全独立的索引,可以单独查找。

当文档添加到索引(或从索引中删除)时,

段(及其相关文件)由 Lucene 自动创建和合并,因为它认为必要/适当。您不需要采取任何特定操作,除非您面临手动触发合并可能有益的特定情况。

Lucene 需要跨多个段进行搜索,会带来性能成本;相反,执行合并会产生性能成本。我的建议:您应该假设 Lucene 最了解情况,并让其自行管理其分段,除非您确定有充分的理由不这样做。

例如,请参阅

forceMerge()

 的 JavaDoc,其中指出:

这是一个代价高昂的操作,特别是当你传递一个小的 maxNumSegments 时;通常,只有当索引是静态的(将不再更改)时才应该调用它。

对于

maybeMerge()

,我会给出与上面相同的建议:将其留给 Lucene,除非您有非常具体的原因/问题需要干预。我绝对
不想想要调用writer.maybeMerge();
十亿次,因为其中可能会发生几次合并。

© www.soinside.com 2019 - 2024. All rights reserved.