关于Lucene索引合并解决方法

由于Clustor的问题造成无法对索引进行同步,脑子中马上浮现用rmi(双机),UDP广播(多机)作通信中间件对clustor进行索引同步但这样经过测试后效率相对较低,故另辟蹊径,最终用索引合并的方式进行快速的索引整合,达到时间短索引同步快的目的。代码如下:

Java代码  收藏代码
  1. package com.pccw;  
  2.   
  3. import java.io.File;  
  4.   
  5. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  6. import org.apache.lucene.index.IndexWriter;  
  7. import org.apache.lucene.store.FSDirectory;  
  8.   
  9. public class AdvancedTextFileIndexer {  
  10.     /** 
  11.      * @author Shane Zhao about merge Index in PCCW BJDEV 
  12.      * 将小索引文件合并到大的索引文件中去 
  13.      *  
  14.      * @param from 
  15.      *            将要合并到to文件的文件 
  16.      * @param to 
  17.      *            将from文件合并到该文件 
  18.      * @param sa 
  19.      */  
  20.     private static void mergeIndex(File from, File to,StandardAnalyzer sa) {  
  21.         IndexWriter indexWriter = null;  
  22.         try {  
  23.             System.out.println("正在合并索引文件!\t ");  
  24.             indexWriter = new IndexWriter(to, sa, false);  
  25.             indexWriter.setMergeFactor(100000);  
  26.             indexWriter.setMaxFieldLength(Integer.MAX_VALUE);  
  27.             indexWriter.setMaxBufferedDocs(Integer.MAX_VALUE);  
  28.             indexWriter.setMaxMergeDocs(Integer.MAX_VALUE);  
  29.             FSDirectory[] fs = { FSDirectory.getDirectory(from, false) };  
  30.             indexWriter.addIndexes(fs);  
  31.             indexWriter.optimize();  
  32.             indexWriter.close();  
  33.             System.out.println("已完成合并!\t ");  
  34.         } catch (Exception e) {  
  35.             System.out.println("合并索引出错!");  
  36.             e.printStackTrace();  
  37.         } finally {  
  38.             try {  
  39.                 if (indexWriter != null)  
  40.                     indexWriter.close();  
  41.             } catch (Exception e) {  
  42.   
  43.             }  
  44.   
  45.         }  
  46.   
  47.     }  
  48.       
  49.     public static void main(String[] areg){  
  50.         File from = new File("F:/web/faq/lucene/indexDir");  
  51.         File to = new File("F:/indexDir");  
  52.         mergeIndex(from,to,new StandardAnalyzer());  
  53.     }  
  54.   
  55. }  

测试效率为两个150M的索引文件合并时间在10-15s 效率还是很令人满意的。

原文地址:https://www.cnblogs.com/lexus/p/2293966.html