我将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);配置的singleton类中 调用"maybeMerge()"是否足够,因为Lucene在需要时会合并文件?

推荐答案

Bottom line:

如果你没有面临specific的问题,那么你可能没有什么需要改变的,关于如何由Lucene自动管理段合并.


More notes:

是的,Lucene索引目录将包含"一堆文件"——参见Apache Lucene - Index File Formats以获得概述.

相关文件组的形式为segments,其中:

每个段都是一个完全独立的索引,可以单独搜索.

段(及其相关文件)为automatically created and merged by Lucene,如果它认为必要/适当,因为文件被添加到索引(和从索引中删除).您不需要采取任何特定的操作,除非您面临手动触发的合并可能是有益的特定情况.

Lucene需要跨多个数据段进行搜索会带来性能成本;相反,执行合并会带来性能成本.我的建议是:你应该假设Lucene最了解,让它自己管理它的细分,除非你确定你有一个很好的理由这样做.

例如,参见JavaDoc for forceMerge(),其中声明:

这是一个非常昂贵的操作,特别是当你传递一个小的maxNumSegments时;通常你应该只在索引是静态的(不再被更改)时调用它.

对于maybeMerge()个,我会给出与上面相同的建议:把它留给Lucene,除非你有一个非常具体的原因/问题来干预.我绝对会not想打writer.maybeMerge();十亿次电话,在合并可能发生的几次.

Java相关问答推荐

Java 21虚拟线程会解决转向react 式单线程框架的主要原因吗?

OpenJDK、4K显示和文本质量

为什么一个java函数会返回一个作为参数传递给它的对象?

JDK22执行repackage of goal org. springframework. boot:spring—boot—maven—plugin:3.2.3:repackage failed:unsupported class file major version 66—>

使用Testcontainers与OpenLiberty Server进行集成测试会抛出SocketException

FALSE:它应该在什么时候使用?

是否在允许数组元素为空时阻止 idea 为空性警告?

这是什么Java构造`(InputStream Is)->;()->;{}`

在Java中,在单个逻辑行中连接列表和单个元素的正确方法是什么?

为什么Java编译器不区分不同类型的方法?

如何在Cosmos DB(Java SDK)中增加默认响应大小

Java17支持哪个MapR版本?

将PNG转换为位图自定义十六进制字符串

使用While循环打印素数,无法正常工作

try 使用类来包含JSON响应

如何使用MapStrCut转换双向链接

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

按长度排序字符串数组

Java 8 中 ByteBuffer 和 BitSet 的奇怪行为

在java中使用SevenZip.openArchive方法后无法删除文件