0

我有两个 Lucene 索引,我正在尝试与 Lucene 4.X 中的 ParallelCompositeReader 一起打开它们。两个索引以相同的顺序包含相同数量的文档 (14365790)。我的代码如下所示:

val articlesReader = DirectoryReader.open(FSDirectory.open(...))
val citationCountReader = DirectoryReader.open(FSDirectory.open(...))
val reader = new ParallelCompositeReader(articlesReader, citationCountReader)

当我运行此代码时,我收到以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: All readers must have same number of subReaders
    at org.apache.lucene.index.ParallelCompositeReader.validate(ParallelCompositeReader.java:147)
    at org.apache.lucene.index.ParallelCompositeReader.prepareSubReaders(ParallelCompositeReader.java:100)
    at org.apache.lucene.index.ParallelCompositeReader.<init>(ParallelCompositeReader.java:71)
    at org.apache.lucene.index.ParallelCompositeReader.<init>(ParallelCompositeReader.java:64)
    at org.apache.lucene.index.ParallelCompositeReader.<init>(ParallelCompositeReader.java:58)

关于索引的一些信息:

  • articlesReader 索引包含每篇文章的标题、摘要和出版年份等信息。它是几年前由其他人使用 Lucene 3.X 创建的。重新创建非常大且耗时,所以如果可能的话,我宁愿不修改它

  • citationCountReader 索引包含每篇文章的引用计数。它是通过遍历articlesReader 创建的。这是一个 Lucene 4.X 索引。这个只需要几个小时来重新创建,所以如果我必须重新创建任何东西,我宁愿修改这个。(当然,我也不想重新创建。)

我对 ParallelCompositeReader 的源代码进行了一些研究,似乎抛出了这个错误,因为.getSequentialSubReaders()返回一个大小为 1 的articlesReader列表,但返回一个大小为 3 的列表citationCountReader。但我不知道什么SequentialSubReaders是或如何使它们在两个索引中相同。这很可能不是关键问题和/或我的问题有更好的解决方案。

4

1 回答 1

1

好的,事实证明问题在于两个索引的段数不同。所以我不得不强制将索引与多个段合并为一个段。这是我所做的:

val config = new IndexWriterConfig(Version.LUCENE_40, ...)
config.setOpenMode(IndexWriterConfig.OpenMode.APPEND)
val indexWriter = new IndexWriter(FSDirectory.open(...), config)
indexWriter.forceMerge(1)
indexWriter.close

一旦两个索引都有一个段,然后.getSequentialSubReaders()为两个读取器返回一个大小为 1 的列表,ParallelCompositeReader 就能够加载它们。

于 2012-09-10T07:47:59.987 回答