由于Clustor的问题造成无法对索引进行同步,脑子中马上浮现用rmi(双机),UDP广播(多机)作通信中间件对clustor进行索引同步但这样经过测试后效率相对较低,故另辟蹊径,最终用索引合并的方式进行快速的索引整合,达到时间短索引同步快的目的。代码如下:
package com.jiepu.lucene_23;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
import java.util.Date;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.FSDirectory;
//lucene索引合并:需要版本相差不大或者相同
public class Merge {
/**
* @author Shane Zhao about merge Index in PCCW BJDEV
* 将小索引文件合并到大的索引文件中去
*
* @param from
* 将要合并到to文件的文件
* @param to
* 将from文件合并到该文件
* @param sa
*/
private static void mergeIndex(File from, File to,StandardAnalyzer sa) {
IndexWriter indexWriter = null;
try {
System.out.println("正在合并索引文件!\t ");
indexWriter = new IndexWriter(to, sa, false);
indexWriter.setMergeFactor(100000);
indexWriter.setMaxFieldLength(Integer.MAX_VALUE);
indexWriter.setMaxBufferedDocs(Integer.MAX_VALUE);
indexWriter.setMaxMergeDocs(Integer.MAX_VALUE);
FSDirectory[] fs = { FSDirectory.getDirectory(from) };
indexWriter.addIndexes(fs); //索引合并
indexWriter.optimize();
indexWriter.close();
System.out.println("已完成合并!\t ");
} catch (Exception e) {
System.out.println("合并索引出错!");
e.printStackTrace();
} finally {
try {
if (indexWriter != null)
indexWriter.close();
} catch (Exception e) {
}
}
}
private static void mergeIndex2(File froms[], File to,StandardAnalyzer sa) {
IndexWriter indexWriter = null;
try {
System.out.println("正在合并索引文件!\t ");
indexWriter = new IndexWriter(to, sa, false);
indexWriter.setMergeFactor(100000);
indexWriter.setMaxFieldLength(Integer.MAX_VALUE);
indexWriter.setMaxBufferedDocs(Integer.MAX_VALUE);
indexWriter.setMaxMergeDocs(Integer.MAX_VALUE);
FSDirectory[] fs = new FSDirectory[froms.length];
for (int i=0;i<froms.length;i++) {
fs[i]=FSDirectory.getDirectory(froms[i]);
}
//indexWriter.addDocument(new Document());
indexWriter.addIndexes(fs); //索引合并
indexWriter.optimize();
indexWriter.close();
System.out.println("已完成合并!\t ");
} catch (Exception e) {
System.out.println("合并索引出错!");
e.printStackTrace();
} finally {
try {
if (indexWriter != null)
indexWriter.close();
} catch (Exception e) {
}
}
}
public static void main(String[] areg){
File from = new File("e:/index2");
File to = new File("e:/index");
//mergeIndex(from,to,new StandardAnalyzer());
mergeIndex2(new File[]{new File("e:/index2"),new File("e:/index")},new File("e:/index4"),new StandardAnalyzer());
}
}
http://blog.youkuaiyun.com/witsmakemen/article/details/7481789