2012-09-10 27 views
0

我有兩個Lucene索引,我試圖用Lucene 4.X中的ParallelCompositeReader一起打開。兩個索引都按相同的順序包含相同數量的文檔(14365790)。我的代碼如下所示:我該如何解決Lucene並行讀取器錯誤「所有讀者必須具有相同數量的子讀取器」?

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是什麼或如何使它們在兩個指標中相同。很可能這不是關鍵問題,或者我的問題有更好的解決方案。

回答

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能夠加載它們。

相關問題