《開發自己的搜尋引擎》讀書筆記——Lucene搜尋
-
使用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:就是權重,表示一次查詢時,索引中的某個文件的重要性。
-
Hits類
(1)、length()取得當前結果集的數量;
doc(intn)取得當前結果集中第n個Document;
floatscore(int n)取得當前結果集中第n個Document的得分;
intid(int n)取得當前結果集中第n個Document的索引內部id值
Iteratoriterator()取得對Hits集合的遍歷物件
-
對搜尋結果評分
-
構建各種Lucene內建的Query物件
-
TermQuery詞條搜尋
一個Term物件包括有兩個資訊。它們分別為詞條本身文字內容和詞條所在的Field資訊。在TermQuery的建構函式中,需要這樣一個Term物件來作為其引數。然後,使用IndexSearcher的search(Query)方法得到所需要的結果。
-
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這樣的複合型別查詢。
-
RangeQuery範圍搜尋
查詢一定範圍內的文件,這種範圍可以是時間、日期、數字大小等。
-
PrefixQuery字首搜尋
比如,到圖書館查詢一本書,可能只記得書名的最前面幾個字。
-
PhraseQuery短語搜尋
PhraseQuery提供了一種稱為“坡度”的引數,它用於表示片語的兩個字之間可以插入無關字的個數。該值預設為0,但是可以通過setSlop方法修改這個值。
-
MultiPhraseQuery多短語搜尋
可以對多個短語同時進行檢索。每一次add都是一波並列。
-
FuzzyQuery模糊搜尋
可以進行單字的模糊查詢,模糊查詢所使用的演算法被稱為levenshtein演算法。這種演算法在比較兩個字串時,將動作分為3種:
加一個字母(insert);
刪一個字母(delete);
改變一個字母(substitute)。
兩個字串之間進行比較時,就是執行將其中一個字串,轉變為另一個字串的操作。每執行一項上述操作,則相應的扣除一定分數。當比較完畢,也就是轉變完畢,此時的得分被稱為兩者之間的距離,也可以叫做模糊度。
-
WildcardQuery萬用字元搜尋
通常情況下,用“*”表示任意長的字串,用“?”表示一個單一的字元。
-
SpanQuery跨度搜索
-
第三方提供的Query物件:RegexQuery
結合正則表示式。
-
通過QueryParser轉換使用者關鍵字
-
詞條定義。詞條與詞條之間要用空格隔開;另外有些使用引號包圍起來的關鍵字串均包含兩個詞條。
-
在QueryParser中,使用與建立索引時相同的分析器,是為了確保使用者在輸入、分詞時能夠和索引中的內容相一致。在QueryParser的建構函式中,要為QueryParser賦一個預設的field。這是因為通常情況下,使用者並不知道後臺的索引中都有哪些Field,而讓使用者來指定Field是一個不友好的行為,因此需要告知QueryParser一個預設的Field資訊。在使用者未指定時,則告知Lucene按預設的Field進行檢索。
-
改變QueryParser預設的布林邏輯。
-
短語和QueryParser。
在PharseQuery的最後使用一個“~”來表示其坡度值。
-
FuzzyQuery的預設匹配度為0.5
-
建立索引時,如果按照日期表示的字串來進行索引,那麼在RangeQuery時,實際上比較的是字串的字典順序。而若首先將日期轉化為以毫秒計算的時間,則可以精確地比較兩個日期的大小了。建議在使用Lucene時,當遇到日期型資料時,都先使用DateTools進行轉換,再進行索引。