2013-04-17 95 views
1

如何合併2個或多個lucene索引並避免在最終索引中出現重複值?如何合併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"); 
+0

當有重複時,應該保留哪一個? – jpountz

+0

任何人都可以保持最終指數 – masm

回答

2

我不相信Lucene提供任何好的簡單的方法來做到這一點,像addIndexes

你可能不得不或者:

請再次通過索引刪除重複。您可以使用TermsEnum來獲取每個文檔中您的id字段的term()docFreq(),以檢測重複項。然後,您可以從DocsEnum獲得DocID,從呼叫TermsEnum.docs

或者,可能更爲清晰的方法是自己執行合併,使用IndexWriter.updateDocument來防止重複。