lucene分佈式幾種方法

1、如果應用程序架構由多個LUCENE索引組成,則可以通過MutltiSearcher把所有索引搜索。也可以通過ParallelMultiSearcher進行多線程搜索。在單核的情況下,MultiSearcher比ParallelMultiSearcher性能更高。

2、MultiSearcher

搜索2個搜索,把動物按首字母在字母表中的位置分成2部分,一部分一個索引

public class MultisearcherTest extends TestCase{

private Indexsearcher[] searchers;

public void setUp() throws Exception{

String[] animals={"aardvark","beaver","coati","dog","lemur",

"python","vicuna","zebra"};

Ananlyzer analyzer=ne WhitespaceAnalyzer();

Directory aTomDirectory =new RAMDirectory();

Directory nTOzDirectory=new RAMDirectory();

//建立2個索引

IndexWriter aTomwriter=new IndexWriter(atomDirectory,analyzer,true);

IndexWriter nTozwriter=new IndexWriter(aTozDirectory,analyzer,true);

for (int i=0;i<anaimals.length;i+){

Document doc=new Document();

String animal=animals[i];

doc.add(Filed.Keyword("animal",animal));

if (animal.compareToIgnoreCase("n")<0){

aTomWriter.addDocument(doc);//前半部分索引a-m

}else{

nTozWriter.addDocument(doc);//後半部分索引 n-z

}

}

aTomwriter.close();

nTozwriter.close();

searchers=newIndexsearcher[2];

searcher[0]=new IndexSearcher(aTOmDirectory);

searcher[1]=new IndexSearhcer(nTOzDirectory);

}

public void testMulti() throws Exception{

MultiSearcher searcher=new MultiSearcher(searchers);

//對2個索引進行搜索

Query query=new RangeQuery(new Term("animal","h"),new Term("animal","t"),true);

Hits hits= searcher.search(query);

}

}

3、ParallelMultiSearcher多線程搜索

搜索操作爲每個Searchable分配一個線程,直到所有線程都完成其搜索。基本搜索和進行過濾的搜索是並行執行的。

lucene通過RMI爲用戶提供搜索遠程索引功能。

RMI服務器綁定了一個RemoteSearchable的實例,它和IndexSearcher、MultiSearch一樣,實現Searchable接口

1)把文檔按26個字母切分爲26個索引。服務器端向客戶端提供2個RMI調用

public class SearchServer{

private static final String ALPHABET="abcdefghijklmnopqrstuvwxyz";

public static void main(String[] args) throws Exceptino{

if (args.length!=1){

System.err.printLn("Usage:Searchserver<basedir>");

System.exit(-1);

}

String basedir=args[0];

//爲每個索引建立一個IndexSearcher對象

Searchable[] searchables=new Searchable[ALPHABET.length()];

for (int i=0;i<ALPHABET.length;i++){

searchables[]=new IndexSearcher(new File(basedir,""+ALPHABET.charAt(i)).getAbsolutePath());

}

//註冊可供客戶端調用服務的端口

LocateRegistry.createRegistry(1099);

//使用 multiSearcher完成所有索引的搜索

Searcher multiSearcher=new MultiSearcher(searchables);

RemoteSearchable multiImpl=new RemoteSearchables(multiSearcher);

Naming.rebind("//localhost/LIA_Multi",multiImpl);//註冊RMI方法

//使用 parallelSearcher 完成搜索

Searcher parallelSearcher=new ParallelMultiSearcher(searchables);

RemoteSearchable parallelImpl=new RemoteSearchables(parallelSearcher);

Naming.rebind("//localhost/LIA_Parallel",parallelImpl);//註冊RMI方法

System.out.println("server started");

}

}

2)客戶端

public class SearchClient{

private static HashMap searchercache=new HashMap();

public static void main(String[] args) throws Exception{

if (args.length!=1){

System.err.println("Usage:SearchClient <query>");

System.exit(-1);

}

String word=args[0];

for (int i=0;i<5;i++){

search("LIA_Multi",word);//調用服務器的multi方法搜索

search("LIA_Multi",word);//調用服務器的multi方法搜索

}
}

private static void search(String name,String word) throws Exception{

TermQuery query=new TermQuery(new Term("word",word));

MultiSearcher searcher=(MultiSearcher) searcherCache.get(name);//檢查緩存中是否有該搜索器,該搜索器是帶緩存功能的

if (searcher==null){//沒有該搜索,則生成新的搜索

searcher=new MultiSearcher(new Searchable[]{lookupRemote(name)});

searcherCache.put(name,searcher);

}

//統計時間

long begin=new Date().getTime();

Hits hits=searcher.search(query);

long end=new Date().getTime()

...........

...........

//不要關閉searcher對象

}

private static Searchable lookupRemote(String name) throws Exception{

return (Searchable) Naming.lookup("//localhost/"+name);

}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章