国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Lucene的多索引搜索的研究與應(yīng)用

2012-05-08 04:41:46高玉良張濟(jì)強(qiáng)白瑤
電腦知識(shí)與技術(shù) 2012年7期

高玉良 張濟(jì)強(qiáng) 白瑤

摘要:Lucene是一個(gè)高性能、易擴(kuò)展的基于Java技術(shù)的開源信息檢索工具包,它可以為多種應(yīng)用程序提供索引和搜索功能。該文探討了Lucene中在多個(gè)索引上進(jìn)行搜索的方式,分析了每種方式的性能以及應(yīng)用范圍,引進(jìn)Java的線程池技術(shù)對(duì)多索引上的多線程搜索算法進(jìn)行改進(jìn),并且通過實(shí)驗(yàn)驗(yàn)證改進(jìn)算法的優(yōu)越性。

關(guān)鍵詞:Lucene;多索引;線程池

中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2012)07-1470-03

Research and Application of Multi-index Based Lucene

GAO Yu-liang, ZHANG Ji-qiang, BAI Yao

(Dalian JiaoTong University, Dalian 116028, China)

Abstract: Lucene is a tool based on Java technology, it is an open source,and possess character of high performance and being easy to expand.Lucene provide a function to searcher for application.The paper discuss a searching method about mutile index in lucene,and its performance and range of application. Java Thread Pool are used to improve multile index ing searcher , and certify that this algorithm is higher performance.

Key words: Lucene; multi index; thread pool

對(duì)于大型的檢索系統(tǒng),索引文件可能存在于多個(gè)目錄中,每次進(jìn)行檢索請(qǐng)求時(shí),檢索系統(tǒng)可能要對(duì)存在于多個(gè)目錄中的索引文件進(jìn)行檢索。在這種情況下,Lucene主要提供兩種方式,即MultiSearcher和ParalellMultiSearcher對(duì)存在于多目錄中的索引進(jìn)行搜索。MultiSearcher是用一個(gè)循環(huán)把存在于不同目錄中的索引取出,然后逐個(gè)檢索并合并搜索結(jié)果。ParalellMultiSearcher是用多線程的方式,對(duì)于不同目錄中的索引建立不同的線程進(jìn)行并行的搜索,同時(shí)動(dòng)態(tài)的合并搜索結(jié)果。但以前的Lucene開發(fā)包中的ParalellMultiSearcher檢索方式的性能低于MultiSearcher,本文對(duì)ParalellMultiSearcher的多線程實(shí)現(xiàn)方式進(jìn)行改進(jìn),引入了線程池技術(shù)。

1 Lucene的構(gòu)成及檢索機(jī)制

1.1 Lucene的構(gòu)成

Lucene是Apache基金會(huì)Jakarta的一個(gè)子項(xiàng)目,完全按照面向?qū)ο蟮乃枷朐O(shè)計(jì)而成。各個(gè)類之間滿足低耦合的原則,是一個(gè)高效率的搜索工具包。Lucene完全由Java JDK開發(fā)而成,沒有用到任何第三方開發(fā)包?;贘ava語言良好的可移植性,Lucene也具有良好的跨平臺(tái)特性。最新的Lucene開發(fā)包在2011年3月份發(fā)布,版本為3.0。

1.2 Lucene主要由以下部分組成

1) Analysis包。包括Lucene的語言分詞器。最新的開發(fā)包提供很好的多語言分詞器適應(yīng)多語言檢索系統(tǒng)的開發(fā)。

2) Index包。此包為Lucene的非常關(guān)鍵的一個(gè)包,包換Lucene中各種索引文件的生成以及索引的刪除、更新等類。

3) Document包。包括Lucene中建立索引的數(shù)據(jù)結(jié)構(gòu),構(gòu)成Lucene中索引文件的組成部分。

4) Messages包。提供一個(gè)消息接口。

5) QueryParse包。Lucene的查詢分析包,提供各種查詢間的各種運(yùn)算,包括與,或,非等。

6) Store包。提供有關(guān)索引文件存儲(chǔ)方式的包。

7) Search包。Lucene的檢索包,這個(gè)包主要是提供在已經(jīng)生成的索引(也就是用Index生成的各種類型的索引)之上進(jìn)行檢索的各個(gè)類。

8) Util包。一個(gè)工具包。

1.3 Lucene的索引機(jī)制

在Lucene中,索引(Index)由Segment組成,Segment由Document組成,Document由Field組成,F(xiàn)ield由Term組成。生成的索引有三種存儲(chǔ)方式:內(nèi)存(RAM),文件系統(tǒng)(FS),數(shù)據(jù)庫系統(tǒng)(DB)。RAM方式適用于小型的系統(tǒng),F(xiàn)S方式適應(yīng)于中型的搜索系統(tǒng),DB方式適應(yīng)于大型分布式的搜索系統(tǒng)。

以FS文件系統(tǒng)方式開發(fā)的搜索系統(tǒng),會(huì)生成相應(yīng)的索引文件。對(duì)于大中型的搜索系統(tǒng),索引文件可能會(huì)存儲(chǔ)于不同的目錄中。Lucene的索引文件是以倒排文件的形式生成的。倒排文件直觀上說就好像一本書的目錄,這種結(jié)構(gòu)的文件格式有利于Lucene提供高性能的檢索服務(wù)。

1.4 Lucene中的多索引搜索

事實(shí)上,在一些成熟的商業(yè)系統(tǒng)中,索引并非總是存放在一個(gè)目錄中。很多時(shí)候,系統(tǒng)會(huì)按照某種散列算法將文檔分散地放置在不同的索引目錄下[]。另外,還有可能在多個(gè)目錄中存在著用戶想要查找的內(nèi)容。在Lucene中,有兩種方式可以用于多目錄索引的查找。

2 MultiSearcher方式

使用MultiSearcher方式查找,首先要構(gòu)建一個(gè)IndexSearcher數(shù)組,該數(shù)組中包括了若干的IndexSearcher對(duì)象,分別用于查找不同的索引目錄。這個(gè)數(shù)組被傳入MultiSearcher的構(gòu)造函數(shù)中。當(dāng)MultiSearcher構(gòu)造完畢后,可以調(diào)用searcher方法來進(jìn)行查找。實(shí)際上,MultiSearcher的實(shí)現(xiàn)方式是用一個(gè)循環(huán)來遍歷傳入的IndexSearcher數(shù)組,進(jìn)行查找,并把結(jié)果集返回。

下面是MultiSearcher方式的關(guān)鍵代碼:

1)建立IndexSearcher對(duì)象

IndexSearcher searcher1 = new IndexSearcher(INDEX_PATH1);

IndexSearcher searcher2 = new IndexSearcher(INDEX_PATH2);

IndexSearcher searcher3 = new IndexSearcher(INDEX_PATH3);

2)建立SearcherIndex對(duì)象數(shù)組

IndexSearcher[] searchers = {searcher1,searcher2,searcher3};

3)應(yīng)用MultiSearcher

MultiSearcher msearcher = new MultiSearcher(searchers);

ScoreDoc[] hits = msearcher.searcher(qurey,filter,n).scoreDocs;

For (int i = 0; i < hits.length(); i++) {

Document hitDoc msearcher.doc(hits[i].doc);

System.out.println(hitDoc.get(fieldname));

}

2.1 ParalellMultiSearcher方式

MultiSearcher實(shí)際上是用一個(gè)循環(huán)來遍歷IndexSearcher的對(duì)象數(shù)組,然后把查詢結(jié)果合并到一起。在這個(gè)過程中,只有一個(gè)索引被搜索,其他的索引一直處于等待狀態(tài)。為了充分利用計(jì)算機(jī)并行處理問題的能力,Lucene中引入了具備多線程能力的ParalellMultiSearcher類提供對(duì)多個(gè)索引進(jìn)行并行查詢。在最新的Lucene 3.0中,ParalellMultiSearcher使用了線程池技術(shù),下面先對(duì)Java中的線程池做一個(gè)簡單的介紹。

2.2 Java線程池介紹

newFixedThreadPool創(chuàng)建一個(gè)指定工作線程數(shù)量的線程池。每當(dāng)提交一個(gè)新任務(wù)就創(chuàng)建一個(gè)工作線程,當(dāng)線程數(shù)量達(dá)到線程池的初始設(shè)置的數(shù)量時(shí),則將任務(wù)存入到池隊(duì)列中。

newCacheThreadPool創(chuàng)建一個(gè)可緩存的線程池,這類線程池的工作線程的數(shù)量只受到系統(tǒng)中最大數(shù)量的限制,并且長時(shí)間沒有新線程加入到池中的時(shí)候,線程池中的工作線程將自動(dòng)中止。如果再有新的任務(wù)提交,則線程池重新創(chuàng)建新的工作線程。

newSingleThreadExecutor創(chuàng)建一種線程數(shù)量為1的FixthreadPool,適用于對(duì)一個(gè)連續(xù)事務(wù)的處理。

newScheduleThreadPool創(chuàng)建一個(gè)支持定長的線程池,最重要的是支持定時(shí)的任務(wù)執(zhí)行。

2.3 ParallelMultiSearcher的具體實(shí)現(xiàn)

通過以上對(duì)Java線程池的介紹,筆者認(rèn)為,newCacheThreadPool這種線程池比較適合Lucene中多線程的查詢應(yīng)用。因?yàn)樵贚ucene的查詢中,查詢請(qǐng)求往往是間斷的提交。比如一次請(qǐng)求對(duì)200個(gè)索引查詢,然后間隔五分鐘又有一個(gè)對(duì)300個(gè)索引的查詢。由于這種間斷性,如果選擇newFixedThreadPool這種線程池,當(dāng)沒有查詢請(qǐng)求時(shí),線程池中的線程不會(huì)得到釋放,會(huì)造成系統(tǒng)資源的大量占用。另一個(gè)原因,newFixedThreadPool的線程池大小在初始化的時(shí)候設(shè)定,而且不可以改變,線程池的初始值大小的選擇可能對(duì)系統(tǒng)性能造成影響。

關(guān)鍵代碼:

ParallelMultiSearcher searcher =

new ParallelMultiSearcher(searchers);

ParallelMultiSearcher的構(gòu)造函數(shù):

public ParallelMultiSearcher(Searchable... searchables)

throws IOException {

super(searchables);

this.searchables = searchables;

this.starts = getStarts();

executor = Executors.newCachedThreadPool(new namedThreadFactory(this.getClass().getSimpleName()));

}

通過對(duì)以上兩種方式的分析,讓我們對(duì)Lucene中多線程檢索有了更深的認(rèn)識(shí)。下面是具體的實(shí)驗(yàn)情況。

3實(shí)驗(yàn)結(jié)果分析

表1

表1的數(shù)據(jù)是分別對(duì)10到1000個(gè)索引以兩種方式進(jìn)行查詢時(shí)所用的時(shí)間比較,可以看出,多線程查詢方式的優(yōu)勢(shì)還是比較明顯的。

4結(jié)束語

該文對(duì)Lucene中多索引查找的兩種方式進(jìn)行了介紹。在以前的Lucene版本中,多線程的搜索方式?jīng)]有引入線程池,這樣,線程每次都要進(jìn)行初始化,造成多線程方式的性能低于Mutil方式。通過引入線程池,解決了這一問題,通過對(duì)實(shí)驗(yàn)數(shù)據(jù)的分析,驗(yàn)證了加入線程池技術(shù)的多索引搜索方式的優(yōu)良性能。但通過實(shí)驗(yàn)也發(fā)現(xiàn)這種方式存在的問題,當(dāng)線程數(shù)目很大時(shí),可能會(huì)造成內(nèi)存的溢出,在實(shí)際應(yīng)用中,應(yīng)該通過上層程序避免此種情況的發(fā)生。

參考文獻(xiàn):

[1] Gospodnetic O,Hatcher E. Lucene in action[M]. Man2ning Publications Co ,2005.

[2]邱哲,符滔滔,王學(xué)松.開發(fā)自己的搜索引擎Lucene+Heritrix.[M]. 2版.北京:人民郵電出版社,2010.

[3]李曉明,朱家稷,閆宏飛.互聯(lián)網(wǎng)上主題信息的一種收集與處理模型及其應(yīng)用[J].計(jì)算機(jī)研究與發(fā)展,2003,40(12).

[4]張敏,高劍峰,馬少平.基于鏈接描述文本及其上下文的Web信息檢索.計(jì)算機(jī)研究與發(fā)展,2004,41(1).

[5]孫建濤,沈科,陸玉昌等網(wǎng)頁分類技術(shù)[J].清華大學(xué)學(xué)報(bào):自然科學(xué)版,2004,44(1).

[6]李曉明,李星.搜索引擎與Web挖掘進(jìn)展[M].北京:高等教育出版社,2003.

[7]徐寶文,張衛(wèi)豐.搜索引擎與信息獲取技術(shù).[M].北京:清華大學(xué)出版社,2003.

[8]李盛濤,吳麗輝,于滿泉,等.主題Web信息采集的研究與設(shè)計(jì)[C]//語言計(jì)算與基于內(nèi)容的文本處理.北京:清華大學(xué)出版社,2003.

海门市| 霸州市| 黄梅县| 鱼台县| 崇义县| 志丹县| 罗定市| 乡宁县| 景谷| 德化县| 嘉峪关市| 丹巴县| 多伦县| 义马市| 资兴市| 合山市| 南充市| 简阳市| 镇宁| 灵山县| 西昌市| 加查县| 久治县| 古浪县| 万宁市| 新沂市| 河北区| 六枝特区| 久治县| 田林县| 虹口区| 中宁县| 乐安县| 张家川| 广饶县| 晋宁县| 额尔古纳市| 铜川市| 聂拉木县| 福贡县| 麻江县|