java搜尋引擎: lucene學習筆記 3

來源:互聯網
上載者:User
文章目錄
  • 分頁的處理
  • Lucene的scoring演算法
搜尋

Lucene搜尋的api的類主要有4個 IndexSearcher ,Query(包括子類),QueryParser,Hits
IndexSearcher是搜尋的入口,他的search方法提供了搜尋功能

Query有很多子類, 各種不同的子類代表了不同的查詢條件,下文詳述

QueryParser是一個非常通用的協助類,他的作用是把使用者輸入的文本轉換為內建的Query對象(大多數web搜尋引擎都提供一個查詢輸入框來讓使用者輸入查詢條件)。QueryParser內建提供了很多文法來使使用可以輸入各種進階條件的Query。比如: "Hello AND world"會被解析為一個AND關係的BooleanQuery,他包含兩個TermQuery(Hell和world)。這些文法雖然強大,但都針對英文設計,對我們需要中文搜尋來說都不需要瞭解太多的Query類型,一般幾個簡單的就夠用了。QueryParser的使用如下

QueryParser.parse(String query, String field, Analyzer analyzer) throws ParseException

其中:query是使用者輸入的內容,field是搜尋預設的field(其他field需要顯式指定),analyzer是用來將使用者輸入的內容也作分析處理(分詞),一般情況下這裡的anaylyzer是index的時候採用的同一analyzer。

另外我們也可以自己構造一個QueryParser: new QueryParser(String field, Analyzer a)(含義同上),這樣做的好處是可以自己定義調整一些參數.

搜尋結果的處理:Hits對象

Hits對象是搜尋結果的集合 主要有下面幾個方法

  1. length() ,這個方法記錄有多少條結果返回(lazy loading)
  2. doc(n) 返回第n個記錄
  3. id(in) 返回第n個記錄的Document ID
  4. score(n) 第n個記錄的相關度(積分)

由於搜尋的結果一般比較大,從效能上考慮,Hits對象並不會真正把所有的結果全部取回,預設情況下是保留前100個記錄(對於一般的搜尋引擎,100個記錄足夠了).

分頁的處理

100條記錄還是太多,我們多半會每頁顯示20條記錄,然後分為若干頁顯示,對於分頁,一般有兩個辦法

  1. 在session中保留indexreader對象和hit對象,翻頁的時候提取內容
  2. 不使用session,每次都簡單處理為重新查詢

lucene推薦先使用第二個辦法,即每次都重新查詢,這樣做的好處是簡單方便,不需要考慮session的問題,lucene的查詢效率也能保證每次查詢時間不長,除非真正有了效能問題,否則不用考慮第一個辦法。

緩衝:RAMDirectory的用法

RAMDirectory對象很好用,通過它,我們可以把一個普通的index完全讀取到記憶體中,用法如下:
RAMDirectory ramDir = new RAMDirectory(dir);
這樣的ramdir效率自然比真正的檔案系統快很多

Lucene的scoring演算法

lucence查詢的紀錄預設按照相關度排序,這個相關度就是score,scoring的演算法是比較複雜的,對於我們做應用的人似乎沒有什麼協助,(先說一下Term: 我的理解是Term為一個獨立的查詢詞,使用者輸入的的查詢通過各種分詞,大小寫處理(正規化),消除stopwords等)以後,會已Term為基本單位),幾個關鍵參數稍微留意一下即可。

  • Term在文章中出現的頻率量
  • 包含同一個Term的文章的頻率
  • field中的boosting參數
  • term的長度
  • term在文章中的數量

一般來說,這些參數我們都不可能去調整, 如果你想瞭解更多,IndexSearcher還提供了一個explain方法, 通過傳入一個Query和document ID,你可以得到一個Explaination對象,他是對內部演算法資訊的簡單封裝,toString()一下就可以看到詳細的說明

建立Query:各種query介紹

最普通的TermQuery
TermQuery最普通, 用Term t=new Term("contents","cap"); new TermQuery(t)就可以構造
TermQuery把查詢條件視為一個key, 要求和查詢內容完全符合,比如Field.Keyword類型就可以使用TermQuery

RangeQuery
RangeQuery表示一個範圍的搜尋條件,RangeQuery query = new RangeQuery(begin, end, included);
最後一個boolean值表示是否包含邊界條件本身, 用字元表示為"[begin TO end]" 或者"{begin TO end}"

PrefixQuery
顧名思義,就是表示以某某開頭的查詢, 字元表示為"something*"

BooleanQuery
這個是一個組合的Query,你可以把各種Query添加進去並標明他們的邏輯關係,添加條件用

public void add(Query query, boolean required, boolean prohibited)

方法, 後兩個boolean變數是標示AND OR NOT三種關係 字元表示為" AND OR NOT" 或 "+ -" ,一個BooleanQuery中可以添加多個Query, 如果超過setMaxClauseCount(int)的值(預設1024個)的話,會拋出TooManyClauses錯誤.

PhraseQuery
表示不嚴格語句的查詢,比如"red pig"要匹配"red fat pig","red fat big pig"等,PhraseQuery所以提供了一個setSlop()參數,在查詢中,lucene會嘗試調整單詞的距離和位置,這個參數表示可以接受調整次數限制,如果實際的內容可以在這麼多步內調整為完全符合,那麼就被視為匹配.在預設情況下slop的值是0, 所以預設是不支援非嚴格匹配的, 通過設定slop參數(比如"red pig"匹配"red fat pig"就需要1個slop來把pig後移動1位),我們可以讓lucene來模糊查詢. 值得注意的是,PhraseQuery不保證前後單詞的次序,在上面的例子中,"pig red"需要2個slop,也就是如果slop如果大於等於2,那麼"pig red"也會被認為是匹配的.

WildcardQuery
使用?和*來表示一個或多個字母比如wil*可以匹配 wild ,wila ,wilxaaaa...,值得注意的是,在wildcard中,只要是匹配上的紀錄,他們的相關度都是一樣的,比如wilxaaaa和wild的對於wil*的相關度就是一樣的.

FuzzyQuery
這個Query對中文沒有什麼用處,他能模糊比對英文單詞(前面的都是片語),比如fuzzy和wuzzy他們可以看成類似, 對於英文的各種時態變化和複數形式,這個FuzzyQuery還算有用,匹配結果的相關度是不一樣的.字元表示為 "fuzzy~"

QueryParser使用

對於搜尋引擎, 很多情況下使用者只需要一個輸入框就要輸入所有的查詢條件(比如google), 這時,QueryParser就派上用場了,他的作用就是把各種使用者輸入轉為Query或者Query組, 他把上面提到的Query的字元表示(Query.toString)轉化為實際的Query對象,比如"wuzzy~"就會轉換為FuzzyQuery, 不過QueryParser用到了Analyzer,所以QueryParser parse過後的Query再toString未必和原來的一樣.Query額外的文法有:

分組:Groupping
比如"(a AND b) or C",就是括弧分組,很容易理解

FieldSelectiong
QueryParser的查詢條件是對預設的Field進行的, 它在QueryParser解析的時候編碼指定, 如果使用者需要在查詢條件中選用另外的Field, 可以使用如下文法: fieldname:fielda, 如果是多個分組,可以用fieldname:(fielda fieldb fieldc)表示.

*號問題
QueryParse預設不允許*號出現在開始部分,這樣做的目的主要是為了防止使用者誤輸入*來頭導致嚴重的效能問題(會把所有記錄讀出)

boosting
通過hello^2.0 可以對hello這個term進行boosting,(我想不到什麼使用者會這樣麼bt)

QueryParser是一個準備好的,立即可以工作的協助類,不過他還是提供了很多參數供程式員調整,首先,我們需要自己構造一個新的QueryParser,然後對他的各種參數來定製化.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.