lucene筆記

<script type="text/javascript"> document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.getData("text"); if (text && text.length>300) { text = text + "/r/n/n本文來自CSDN博客,轉載請標明出處:" + location.href; clipboardData.setData("text", text); } }, 100); } } </script> <script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

Lucene核心包解析

1、 analysis:對需要建立索引的文本進行分詞,過濾等操作。

2、 document:提供對document和field的各類操作。

3、 index:最重要的包,提供建立索引時的各類操作。

4、 queryParse:提供檢索時的分析支持(如:確定檢索詞之間的邏輯與或非關係等)。

5、 search:負責檢索的包,在建立索引後,利用該包對索引進行檢索。

6、 store:提供對索引存儲的支持(如:FSDirectory和RAMDirectory)。

在調用IndexWrite對象的addDocument()方法後,只有最後調用close()纔會將索引寫入磁盤中(當然,當內存中的Document數量達到一定值後,也會寫入磁盤),另外,可以在調用close()前調用optimize()方法進行索引優化

Lucene的Document代表一個需要進行索引的“單元”,任何需要進行索引的文件都必須轉換成document對象,才能被索引和搜索到。

Lucene的Field提供了用戶處理的方式,包括“是否分詞”、“是否索引”、“是否存儲”三種處理方式。由此,Field靜態方法中提供了四種不同類型的字段類型。

1、 Text類型:被切詞和索引的內容,有Field.Text(String, String)和Field.Text(String, Reader),如果參數是Reader,則數據源內容不被存儲,若是String,則被存儲。

2、 KeyWord類型:不被切詞,但被索引並且完整地存儲在索引中(適合於鏈接地址URLs、文件系統路徑信息、時間日期、人名、身份證號碼、電話號碼等)

3、 UnIndexed類型:不被切詞,也不被索引,但其值會被原封不動地存儲在索引中(適合於處理需要和搜索結果顯示在一起的內容,比如在對一個網頁建立索引時,可以將這個網頁的URL添加到UnIndexed類型的字段中,這樣,在搜索到與該網頁相關內容時,就可以將這個引用地址與搜索結果一起顯示出來)

4、 UnStrord類型:與UnIndexed恰好相反,它會被分詞和索引,但不被存儲在索引中(適合於不需要以原有形式重現原始數據的大規模文本,比如網頁的主體部分或者內容巨大的文本文檔)

IndexWriter用於索引建立,加入Document,合併各種索引段,以及控制與索引相關的各方面。

性能調整參數:

1、mergeFactor:用於控制Lucene在把索引從內存寫入磁盤上的文件系統時內存中最大的Document數量,同時,還控制內存中最大Segment數量。

2、maxMergeDocs:用來限制一個Segment中最大的文檔數量。

3、minMergeDocs:用於控制內存中持有的文檔數量,即內存中被“刷”到磁盤前的數量,對磁盤上的Segment大小沒有任何影響。

4、maxFieldLength:對Field的長度進行限制。

Segment是Lucene索引文件最基本的單位,一個Segment是一個獨立的索引,可以由IndexSearch進行單獨的查找。Lucene的工作其實就是不停地往磁盤中加入新的Segment,然後再按一定的算法合併不同的Segment以創建一個新的段。Segment的前綴命名規則是:將segmentInfors.counter值(該值其實表示的就是當前segment中總的文檔數量)先加1後轉換成36進制,然後在前面加上下劃線,

多索引文件格式VS複合索引格式:相互轉化(P236)

索引合併addIndexes()

Lucene索引優化:通過合併磁盤上的索引文件,以便減少文件的數量,從而減少搜索索引的時間。IndexWrite的optimize()方法就是來對索引進行優化的,它將磁盤上的多個Segment進行合併,組成一個全新的Segment。通常情況,該優化應該在對大批量索引建立完成之後再進行調用。(P245)

IndexSearcher類對索引進行檢索,最終使用IndexReader類來作爲實際的索引目錄讀取器。

Lucene檢索結果的集合是用Hits類的實例進行表示。

構建各種Query:

1、 TermQuery:按詞條搜索,最常用的Query

2、 BooleanQuery:“與或”搜索,實質爲一個組合的Query,使用時可以把各種Query對象添加進去並標明它們的邏輯關係

3、 RangeQuery:在範圍內搜索

4、 PrefixQuery:前綴搜索

5、 PhraseQuery:多關鍵字搜索

6、 PhrasePrefixQuery:短語前綴搜索,在PhraseQuery中,如果用戶想查找短語“david robert ”, 又想查找短語“mery robert”,那麼他就只能構建兩個PhraseQuery,然後使用BooleanQuery將它們作爲其中的字句,並使用“或”操作符連接,這樣就能達到需要的效果,PhrasePrefixQuery可以很方便地實現這種需要

7、 FuzzyQuery:模糊查詢,可以簡單地識別兩個相近的詞語

8、 WildcareQuery:通配符搜索

查詢字符串解析QueryParser類:對於搜索引擎(google,百度)來說,很多情況下用戶只需輸入所需查詢的內容,然後點擊“搜索”就可以了,其餘的事全部交給引擎處理,QueryParser正是處理用戶輸入的字符串,其作用就是把各種用戶輸入的字符串轉化爲一個內部的Query或者Query組。雖然Lucene提供的API允許創建各種各樣的Query查詢語句,但它同時允許通過QueryParser查詢分析器生成各種各樣的Query子對象。當用戶輸入兩個關鍵字時,QueryParser默認它們之間爲“或”關係。

Analyzer分析器,其實就是實現“分詞”和“過濾”,分詞器和過濾器分別是通過Tokenizer和TokenFilter類的子類來實現。所有Analyzer均繼承自org.aparhe.lucene.analysis.Analyzer這個抽象基類。

MultiFieldQueryParser多域搜索

MultiSearcher同時搜索多個索引

ParallelMultiSearch多線程搜索

搜索結果的過濾

1、 DataFilter日期過濾器

2、 QueryFilter查詢過濾器,使用一個查詢返回的檢索結果來限制在一個後續查詢中可以得到的檢索內容,並且在QueryFilter中使用了緩存。

3、 CachingWrapperFilter帶緩存的過濾器,可用於包裝一個沒有使用緩存的過濾器,就使其可以自動具有緩存的功能

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