如何修复Lucene并行读取器错误;所有读卡器必须具有相同数量的子读卡器;?
我有两个Lucene索引,我正试图用Lucene 4.X中的ParallelCompositeReader一起打开。两个索引包含相同数量的文档(14365790),顺序相同。我的代码如下所示:如何修复Lucene并行读取器错误;所有读卡器必须具有相同数量的子读卡器;?,lucene,Lucene,我有两个Lucene索引,我正试图用Lucene 4.X中的ParallelCompositeReader一起打开。两个索引包含相同数量的文档(14365790),顺序相同。我的代码如下所示: val articlesReader = DirectoryReader.open(FSDirectory.open(...)) val citationCountReader = DirectoryReader.open(FSDirectory.open(...)) val reader = new P
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)
线程“main”java.lang.IllegalArgumentException中的异常:所有读卡器必须具有相同数量的子读卡器
位于org.apache.lucene.index.ParallelCompositeReader.validate(ParallelCompositeReader.java:147)
位于org.apache.lucene.index.ParallelCompositeReader.prepareSubReaders(ParallelCompositeReader.java:100)
位于org.apache.lucene.index.ParallelCompositeReader.(ParallelCompositeReader.java:71)
位于org.apache.lucene.index.ParallelCompositeReader(ParallelCompositeReader.java:64)
位于org.apache.lucene.index.ParallelCompositeReader(ParallelCompositeReader.java:58)
有关索引的一些信息:
- articlesReader索引包含每篇文章的标题、摘要和发表年份等信息。它是几年前由其他人使用Lucene 3.X创建的。重新创建它非常大而且耗时,所以如果可能的话,我不想修改它
- 引文计数读者索引包含每篇文章的引文计数。它是通过迭代articlesReader创建的。这是一个Lucene 4.X索引。这一个只需要几个小时来重新创建,所以如果我必须重新创建任何东西,我更愿意修改这一个。(当然,我也不想重新创建。)
我深入研究了ParallelCompositeReader的源代码,似乎抛出了这个错误,因为
.getSequentialSubReaders()
为articlesReader
返回一个大小为1的列表,但为引文计数阅读器返回一个大小为3的列表。但我不知道什么是SequentialSubReaders
,也不知道如何在两个索引中使它们相同。很可能这不是关键问题,或者我的问题有更好的解决方案。好的,问题是这两个索引的段数不同。因此,我不得不强制将索引与多个段合并为一个段。以下是我所做的:
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能够加载它们