2

如何合并 2 个或多个 lucene 索引并避免在最终索引中出现重复值?

今天,我正在使用此代码在索引之间进行合并:

        IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_36, new StandardAnalyzer(Version.LUCENE_36));
        IndexWriter writer = new IndexWriter(getFSDirectory(INDEX_DIR), iwc);
        LogMergePolicy logMerge = new LogMergePolicy() {

            @Override
            protected long size(SegmentInfo arg0) throws IOException {
                return 0;
            }
        };
        logMerge.setMergeFactor(1000);
        iwc.setRAMBufferSizeMB(50);

        Directory indexes[] = new Directory[INDEXES_DIR.size()];

        for (int i = 0; i < INDEXES_DIR.size(); i++) {
            Directory d = FSDirectory.open(new File(INDEXES_DIR.get(i)).getAbsoluteFile());

            System.out.println("Adding: " + INDEXES_DIR.get(i));
            indexes[i] = d;
        }

        System.out.print("Merging added indexes...");
        writer.addIndexes(indexes);
        System.out.println("done");
4

1 回答 1

2

我不相信 Lucene 提供了任何很好的简单方法来做到这一点,比如addIndexes.

您可能必须:

再次通过索引以删除重复项。您可以使用TermsEnum获取每个文档中的 id 字段的term()和,以检测重复项。然后,您可以从 a 、从对 的调用中docFreq()获取 DocID 。DocsEnumTermsEnum.docs

或者,可能是更明智的方式,自己执行合并,使用IndexWriter.updateDocument来防止重复。

于 2013-04-17T08:37:21.200 回答