我将 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 在需要时会自行合并文件?
底线:
如果您没有遇到特定问题,那么关于 Lucene 如何自动管理段合并,您可能不需要更改任何内容。
更多注意事项:
是的,Lucene 索引目录将包含“一堆文件” - 请参阅 Apache Lucene - 索引文件格式 了解概述。
相关文件组形成段,其中:
当文档添加到索引(或从索引中删除)时,每个段都是一个完全独立的索引,可以单独查找。
段(及其相关文件)由 Lucene 自动创建和合并,因为它认为必要/适当。您不需要采取任何特定操作,除非您面临手动触发合并可能有益的特定情况。
Lucene 需要跨多个段进行搜索,会带来性能成本;相反,执行合并会产生性能成本。我的建议:您应该假设 Lucene 最了解情况,并让其自行管理其分段,除非您确定有充分的理由不这样做。例如,请参阅 的 JavaDoc,其中指出:
这是一个代价高昂的操作,特别是当你传递一个小的 maxNumSegments 时;通常,只有当索引是静态的(将不再更改)时才应该调用它。对于
maybeMerge()
,我会给出与上面相同的建议:将其留给 Lucene,除非您有非常具体的原因/问题需要干预。我绝对不想想要调用
writer.maybeMerge();
十亿次,因为其中可能会发生几次合并。