[轉]Lucene經驗總結 (轉註:較舊,但有乾貨)

// 轉自:http://zdm2008.blog.163.com/blog/static/20491545200971894520912/html

 

我的的一點經驗,分享之佘,還請你們補充!!java

若是你想學Lucene,那麼Sphinx你必定不能放過jquery

------------------------------------------------------------------------------------------------------------web

搜索引擎知識總結算法

1:搜索引擎按原理和工做方式可分爲:api

A:爬蟲式,主要用Socket實現,基於TCP/IP協議數組

B:目錄索引式,以早期的yahoo爲表明緩存

C:元搜索引擎,即將多個搜索引擎的結果合併返回多線程

 

2:按領域範圍可分爲:app

A:通用搜索引擎---針對全互聯網所有網站和各類數據信息,信息全,領域廣

B:垂直搜索引擎---針對果某一行業,如企業庫搜索,供求信息搜索,房產搜索等

 

3:信息類型分類:

二進制的文檔,音頻,視頻,圖片等。其中常見的二進制文檔有:TXT,WORD,EXCEL,PPT,PDF,XML,HTML

 

5:搜索引擎研究網站

A:數據挖掘研究院---http://www.dmresearch.net

B:哈工大語言技術網---http://www.langtech.org.cn

C:車東的博客---http://www.chedong.com

D:Google黑板報---http://googlechinablog.com

E:搜狗實驗室---http://www.sogou.com/labs/

F:Search Engine Watch,這是全球最大的搜索引擎研究站---http://searchenginewatch.com

 

6:搜索引擎算法

A:深度優先算法,B:廣度優先算法,C:IP段掃描算法

更多的請參考:http://hi.baidu.com/chenhaoxian/blog/item/26d7560f14b69f2f6059f394.html

 

7:網頁分析過程

單詞提取->標點符號去除->大小寫轉換->超高頻詞彙去除->中文分詞->提取URL,EMAIL,真正意文的文本信息等

 

8:信息檢索模型分類

A:布爾模型,B:向量模型,C:機率模型,D:混合模型等

 

9:搜索引擎一般要解決的基本問題

A:信息抓取,B:數據解析,C:索引建立,D:執行檢索

 

10:你要知道什麼叫「倒排索引」

以字或詞作爲索引,很是適合「關鍵詞」搜索

 

11:當前主流的索引技術

A:倒排索引

B:反綴數組

C:簽名文件

------------------------------------------------------------------------------------------------------------

Lucene常識總結

12:Lucene中的分詞方法

(1)單詞切分

A:對於English和Chinese,咱們用StandardAnalyzer就能夠了

B:ChineseAnalyzer

(2)二分法

對於中文,可用CJKAnalyzer,NGram(綜合了單詞切分和二分法)

注:StandardAnalyzer,ChineseAnalyzer,CJKAnalyzer,NGram相關的jar包在:

%LUCENE%/contrib/analyzers/lucene-analyzer-2.1.0.jar包中,視版本不一樣而異

(3)詞典法

如IK分詞器,實現了正反向全切分算法,它包括了兩個分析器,MIK_CAnalyzer使用最大全切分算法和IKAnalyzer使用細粒度全切分算法,相關jar包爲:IKAnalyzer.jar

(4)語義法

(5)基於詞庫,如JE分詞器,能夠向詞庫中添加新詞,查看詞,刪除詞,相關jar包爲:je-analysis-1.5.1.jar

Plus:中科院有個分詞器,是dll形式,在Java中必須藉助JNI,這樣效率和效果都很差,容易死機,不建議採用

(6)好了,說了這麼多分詞器,最後推薦你們用JE分詞器,足夠了

 

13:經常使用二進制文檔解析組件

A:PDF---PDFBox,從http://sourceforge.net/projects/pdfbox/下載PDFBox類庫並解壓,將external和lib下的jar包全copy到你的應用程序/lib下

B:WORD---用POI的一個組件包,textmining,從http://mirrors.ibiblio.org/pub/mirrors/maven2/org/textmining/tm-extractors/0.4/下載tm-extractors-0.4.zip

C:EXCEL---JExcel,從http://www.andykhan.com/jexcelapi/下載

D:XML---DOM4J,從http://www.dom4j.org/下載

E:HTML---HTMLParser,從http://htmlparser.sourceforge.net/下載,咱們須要filterbuilder.jar,htmlparser.jar,htmllexer.jar,thumbelina.jar

F:Lius,用於從各類文檔中提取文本信息,只是對PPT文檔,只能解析出英文

注:推薦使用Lius,

 

14:索引建立方式

靜態索引,動態索引(增量索引)

IndexWriter indexWriter = new IndexWriter(indexPath, new SimpleAnalyzer(), false);

第三個參數的意思就是:是否覆蓋原來的索引,false時爲增量索引

 

15:索引結構:

多文件索引,複合索引

調用indexWriter.useCompoundFile(false),爲多文件索引,默認true爲附和索引

多文件索引時,會建立不少的文件,在打索引開時,會佔用大量的文件句柄資源,形成系統響應慢。而複合索引則會成n倍的減小文件數量,可是,統一文件存儲大量數據會形成數據更新比較慢

 

16:建議不用IndexModifier,它在close時並無真正刪除Document,最好本身封裝IndexWriter和IndexReader

 

17:不要過分使用「過濾器」,會有不小的性能開銷

 

18:Lucene的邏輯組成,我的理解

lucene索引由多個「索引塊」(segment)組成,增量索引以新塊形式出現,每一個「索引塊」由多個「文檔」(document)組成,每一個「文檔」由多個「索引域」(field)組成,「分析器」對每一個「索引域」進行分析,拆分紅不少「索引項」,最終構成了lucene的索引

 

19:Lucene的物理組成,我的理解

A:一般所說的索引指的是:在某個目錄下的全部索引文件

B:多文件索引在建立時,至少會有fdt,fdx,fnm,frq,nrm,prx,tii,tis(這8個能夠稱爲一個索引段)和segments.gen,segments_*10(這兩個爲獨一的)文件,能夠有單段多文件索引,也能夠有多段多文件索引

C:複合索引在建立時,會將以上8個文件合併,造成一個cfs文件,再加個兩個獨一的文件,因此,它也有單段複合索引和多段複合索引兩種

D:此外,多文件索引和複合索引還能夠共存,但只有兩個獨一文件

E:最後咱們經過IndexWriter.optimize(),對全部的文件進行優化成3個文件,cfs,segments.gen和segments_*

 

------------------------------------------------------------------------------------------------------------

實用分類總結

20:咱們大至能夠分爲:

A:索引的創建和優化

B:索引的管理

C:解析用戶請求

D:組合多條件搜索

E:過濾結果,進行排序,高亮處理等

 

21:索引創建和優化

一:創建

(1)增量索引:IndexWriter indexWriter = new IndexWriter(indexPath, new SimpleAnalyzer(), false);

(2)複合索引:indexWriter.useCompoundFile(true)

(3)Field參數含義,Field field = new Field(名稱,內容,存儲方式,索引方式);

存儲方式有三種:Field.Store.NO(不存儲),Field.Store.YES(存儲),Field.Store.Compress(壓縮存儲)

索引方式有四種:Field.Index.NO(不索引),Field.Index.TOKENIZED(分詞並索引),Field.Index.UN_TOKENIZED(不分詞索引),Field.Index.NO_NORMS(禁用分析器處理)

(4)對不一樣文檔Document使用不一樣分析器indexWriter.addDocument(doc,new StandardAnalyzer());

(5)限制Field詞條數量,indexWriter.setMaxFieldLength(200);

(6)因爲lucene採用統一的文檔形式,因此對於非格式文本咱們須要提早格式化,如數字和時間,最好定長表示,不足的用0補充,以保證檢索和排序的正確性

二:優化

(1)利用緩存,減小磁盤讀寫頻率

A:indexWriter.setMergeFactor(10),每10個document合併爲一個索引塊,每10個索引塊合併成一個大索引塊,每10個大索引塊合併成更大的索引塊,依次類推

B:indexWriter.setMaxBufferedDocs(100),用更多的內存換取更快的索引

C:先創建內存索引,再寫入磁盤,用RAMDirectory

D:用indexWriter.optimize()自身優化

(2)減小索引文件數量和大小

 

22:索引的管理

A:瞭解索引自己信息,咱們須要瞭解HITS,HIT,Document各自的屬性和方法,請參照相應的API

B:索引的刪除,添加,更新(本質是先刪除,後添加)

建立表態索引用和增量索引用:IndexWriter

刪除和添加索引用:IndexReader

用IndexReader刪除某個Document,只是作了刪除標記,不參與檢索,要用IndexWriter.optimize()將其物理刪除

C:不一樣目錄的索引合併,用indexWriter.addIndexes(Directory directory),先把其中一個索引讀入內存後優化,再用此方法加入到另外一FSDirectory參數的indexWriter中,優化並關閉,這樣這實現了兩個索引的合併

D:推薦用Luke,是一套lucene索引管理的軟件

 

23:解析用戶請求

A:本身寫程序分析,提取用戶輸入的關鍵字

B:用lucene本身的QueryParser解析,默認是OR邏輯

 

24:組合多條件搜索

A:用BooleanQuery能夠實現「多索引域」搜索

B:MultiSearcher雖然能夠多索引搜索,但實質仍是一個一個順序進行的,能夠用ParallelMultiSearcher實現多線程多索引搜索

C:在BooleanQuery中,不能只含有BooleanClause.Occur.MUST_NOT,不然,只會返回空的結果集

D:組合用QueryParser,TermQuery,BooleanQuery,RegexQuery足以知足檢索需求,以下:

Java代碼 Lucene經驗總結 - Simon - Simon

 

  1. String indexPath = "你的索引目錄";   
  2. String word_list[] = {"中國","北京"};   
  3. String feild_list[] ={"feild_a","feild_b"};   
  4. IndexSearcher indexSearcher = new IndexSearcher(indexPath);   
  5. Analyzer analyzer = new StandardAnalyzer();   
  6. BooleanQuery boolQuery = new BooleanQuery();   
  7.   
  8. for(int i = 0;i < 2;i++){   
  9.     QueryParser parser = new QueryParser(feild_list[i],analyzer);   
  10.     Query query = parser.parse(word_list[i]);   
  11.     boolQuery.add(query,BooleanClause.Occur.SHOULD);   
  12. }   
  13. //以上實現了對用戶輸入的數據實現了lucene自帶的QueryParser解析   
  14. //同時在相應的feild_a和feild_b索引域附進行檢索   
  15.   
  16. Term ta = new Term("date","20090101");   
  17. Term tb = new Term("date","20090131");   
  18. RangeQuery rangeQuery = new RangeQuery(ta,tb,true);   
  19. //日期以年月日方式,定才存儲,這樣才能夠獲得正確結果,true表示包括邊界   
  20.   
  21. boolQuery.add(rangeQuery,BooleanClause.Occur.MUST);   
  22.   
  23. Hits hits = indexSearcher.search(boolQuery);  

 

String indexPath = "你的索引目錄";String word_list[] = {"中國","北京"};String feild_list[] ={"feild_a","feild_b"};IndexSearcher indexSearcher = new IndexSearcher(indexPath);Analyzer analyzer = new StandardAnalyzer();BooleanQuery boolQuery = new BooleanQuery();for(int i = 0;i < 2;i++){ QueryParser parser = new QueryParser(feild_list[i],analyzer); Query query = parser.parse(word_list[i]); boolQuery.add(query,BooleanClause.Occur.SHOULD);}//以上實現了對用戶輸入的數據實現了lucene自帶的QueryParser解析//同時在相應的feild_a和feild_b索引域附進行檢索Term ta = new Term("date","20090101");Term tb = new Term("date","20090131");RangeQuery rangeQuery = new RangeQuery(ta,tb,true);//日期以年月日方式,定才存儲,這樣才能夠獲得正確結果,true表示包括邊界boolQuery.add(rangeQuery,BooleanClause.Occur.MUST);Hits hits = indexSearcher.search(boolQuery);

由此,咱們能夠實現,在用lucene自身QueryParser的前提下,

D-1:同一「索引域」中檢索不一樣關鍵字

D-2:同一「索引域」中檢索同一關鍵字

D-3:不一樣「索引域」中檢索不一樣關鍵字

D-4:不一樣「索引域」中檢索同一關鍵字

是否是夠你通常的實際檢索了!!

 

25:檢索結果的過濾

A:QueryFilter帶有緩存,其它的RangeFilter,PrefixFilter,ChainedFilter都不帶有緩存,要用CachingWrapperFilter包裝纔可

B:儘可能不用過濾器

C:兩種過濾方式,一種是在搜索結果提取出來後過濾,另外一種是把過濾條件加在搜索條件中,後者是其於前者的,因而可知,在搜索前加入太多搜索條件對性能有很大的影響,在有必要更精確的搜索時,仍是建議使用前者吧

 

26:對檢索結果進行排序

A:默認排序規則:得分-->時間

B:對多字段排序,以下

Java代碼 Lucene經驗總結 - Simon - Simon

 

  1. SortField sf1 = new SortField("id",false);//升序   
  2. SortField sf2 = new SortField("date",true);//降序   
  3. SortField fields[] = new SortField[]{sf1,sf2};   
  4. Sort sort = new Sort(fields);   
  5.   
  6. Hits hits = searcher.search(q,sort);//q是一個TermQuery  

 

SortField sf1 = new SortField("id",false);//升序SortField sf2 = new SortField("date",true);//降序SortField fields[] = new SortField[]{sf1,sf2};Sort sort = new Sort(fields);Hits hits = searcher.search(q,sort);//q是一個TermQuery

 

27:關於高亮顯示

能夠參照API和下面這個網址:

http://hi.baidu.com/deepeye/blog/item/83a8e8c4bec788ae8326ac5f.html

另外,咱們也能夠用Jquery,這個JavaScript框架來實現高亮顯示,能夠參考下面這個網址

效果一:http://www.cnblogs.com/yjmyzz/archive/2008/10/19/1314494.html

效果二:http://www.webwoo.org/jquery/200811/21-28450.html

 

28:其它搜索引擎參考:

1:sphinx

http://www.sphinxsearch.org/

http://dev.cgfinal.com/sphinx/sphinx.html

 

2:MySQL全文檢索

http://hi.baidu.com/longchengjiang/blog/item/ef9b05d32527f1083af3cf19.html

http://database.51cto.com/art/200902/111597.htm

相關文章
相關標籤/搜索