1. 程式人生 > >《開發自己的搜尋引擎》讀書筆記——Lucene搜尋

《開發自己的搜尋引擎》讀書筆記——Lucene搜尋

  1. 使用IndexSearcher進行搜尋

    Lucene搜尋相關的API多數都被包含在org.apache.lucene.search包中。其中,最重要的是IndexSearcher類。

    (1)、IndexSearcher有三個public的建構函式,均以索引的存放目錄作為引數。

    (2)、IndexSearcher的最簡單使用

    IndexSearcher searcher = newIndexSearcher(INDEX_STORE_PATH);

    Term t = newTerm("bookname","女");

    Query q = new TermQuery(t);

    Hits hits =searcher.search(q);

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

    System.out.println(hits.doc(i));

    }

    (3)幾個類

    Query:表示一次查詢;

    Hits:表示一次查詢的結果;

    Filter:表示對索引中文件集合的過濾器。它使檢索在某一個文件集合的子集中進行;

    Sort:對索引的結果進行排序的工具;

    HitCollector:對檢索結果進行選擇的一個工具;

    Weight:就是權重,表示一次查詢時,索引中的某個文件的重要性。

  2. Hits類

    (1)、length()取得當前結果集的數量;

    doc(intn)取得當前結果集中第n個Document;

    floatscore(int n)取得當前結果集中第n個Document的得分;

    intid(int n)取得當前結果集中第n個Document的索引內部id值

    Iteratoriterator()取得對Hits集合的遍歷物件

  3. 對搜尋結果評分

  4. 構建各種Lucene內建的Query物件

  1. TermQuery詞條搜尋

    一個Term物件包括有兩個資訊。它們分別為詞條本身文字內容和詞條所在的Field資訊。在TermQuery的建構函式中,需要這樣一個Term物件來作為其引數。然後,使用IndexSearcher的search(Query)方法得到所需要的結果。

  2. BooleanQuery布林搜尋

    在布林查詢的物件中,包含一個子句的集合,各個子句間都是如“與”、“或”這樣的布林邏輯。

    BooleanClause.Occur類主要有3種表示,即MUST、MUST_NOT和SHOULD。

    SHOULD是一個比較特殊的約束,當它與MUST聯用時,它將失去意義。檢索的結果為MUST子句的檢索結果。當它與MUST_NOT聯用時,SHOULD的功能就與MUST一樣,就退變為MUST和MUST_NOT的查詢結果。當SHOULD與SHOULD聯用時,它們就表示一種“或”關係。最終檢索結果為所有檢索子句的檢索結果的並集。

    BooleanQuery的預設最大子句數量為1024.如果超過了這個數量,Lucene會丟擲一個TooManyClauses的異常。但是使用者也可以通過提供的介面來修改這個最大子句數量。

    子句並非只能進行TermQuery那樣的院子查詢,也可以進行如BooleanQuery這樣的複合型別查詢。

  3. RangeQuery範圍搜尋

    查詢一定範圍內的文件,這種範圍可以是時間、日期、數字大小等。

  4. PrefixQuery字首搜尋

    比如,到圖書館查詢一本書,可能只記得書名的最前面幾個字。

  5. PhraseQuery短語搜尋

    PhraseQuery提供了一種稱為“坡度”的引數,它用於表示片語的兩個字之間可以插入無關字的個數。該值預設為0,但是可以通過setSlop方法修改這個值。

  6. MultiPhraseQuery多短語搜尋

    可以對多個短語同時進行檢索。每一次add都是一波並列。

  7. FuzzyQuery模糊搜尋

    可以進行單字的模糊查詢,模糊查詢所使用的演算法被稱為levenshtein演算法。這種演算法在比較兩個字串時,將動作分為3種:

              加一個字母(insert);

              刪一個字母(delete);

              改變一個字母(substitute)。

    兩個字串之間進行比較時,就是執行將其中一個字串,轉變為另一個字串的操作。每執行一項上述操作,則相應的扣除一定分數。當比較完畢,也就是轉變完畢,此時的得分被稱為兩者之間的距離,也可以叫做模糊度。

  8. WildcardQuery萬用字元搜尋

    通常情況下,用“*”表示任意長的字串,用“?”表示一個單一的字元。

  9. SpanQuery跨度搜索

  1. 第三方提供的Query物件:RegexQuery

    結合正則表示式。

  2. 通過QueryParser轉換使用者關鍵字

  1. 詞條定義。詞條與詞條之間要用空格隔開;另外有些使用引號包圍起來的關鍵字串均包含兩個詞條。

  2. 在QueryParser中,使用與建立索引時相同的分析器,是為了確保使用者在輸入、分詞時能夠和索引中的內容相一致。在QueryParser的建構函式中,要為QueryParser賦一個預設的field。這是因為通常情況下,使用者並不知道後臺的索引中都有哪些Field,而讓使用者來指定Field是一個不友好的行為,因此需要告知QueryParser一個預設的Field資訊。在使用者未指定時,則告知Lucene按預設的Field進行檢索。

  3. 改變QueryParser預設的布林邏輯。

  4. 短語和QueryParser。

    在PharseQuery的最後使用一個“~”來表示其坡度值。

  5. FuzzyQuery的預設匹配度為0.5

  6. 建立索引時,如果按照日期表示的字串來進行索引,那麼在RangeQuery時,實際上比較的是字串的字典順序。而若首先將日期轉化為以毫秒計算的時間,則可以精確地比較兩個日期的大小了。建議在使用Lucene時,當遇到日期型資料時,都先使用DateTools進行轉換,再進行索引。