Lucene的組合查詢

2021-06-09 20:57:35 字數 1291 閱讀 2520

在lucene中實現組合查詢的方法很多,我目前用過的方法有三種,使用multifieldqueryparser,使用filter,使用boolean query。

1.使用multifieldqueryparser     

構建parser的時候使用multifieldqueryparser,查詢時便可以同時在索引的多個域中搜尋關鍵字。適用情況舉例:將文章的標題和內容分別存在索引的不同field中,但是希望同時在兩個field中查詢同乙個關鍵字。假定這兩個field為「name」和「content」,語句如下:

multifieldqueryparser parser=new multifieldqueryparser(new string,new standardanalyzer());

構造query時使用這個parser即可實現同時在兩個field中查詢:

query query=parser.parse(keyword);

2.使用filter

使用queryfilter實現在搜尋結果中再查詢。關鍵語句如下:

keyword1和keyword2 是兩個關鍵字,其先後順序對於搜尋結果集沒有影響。使用searcher時同時傳入query和filter即可。

例如,搜尋關鍵字是「部落格」、」wauwa「,那麼搜尋出來的結果是同時包含」部落格「和」wauwa「的文章。

3.使用boolean query

上述兩種方法實現的功能都不夠強大,實現的是較為簡單的組合。第一種是多個field的組合,第二種是多個關鍵字的組合。使用boolean query 可以實現比較複雜的組合查詢,實現也比較簡單。

簡單來說,boolean query實現了將針對不同關鍵字,不同field的query組合在一起。

// 構造乙個布林查詢

booleanquery bquery = new booleanquery();

for(int i=0;i先構造乙個布林查詢,在為每個關鍵字建立乙個query,再把這個query新增到布林查詢中,查詢時向searcher傳入bquery即可。

此處的query可以根據需要,查各種field,各種關鍵字,都可以,boolean query中可以新增的query數目極限是1024條,但是網路上有一些資料說超過一定數目但未達1024條時會提示clause過多。

booleanclause.occur.must中的must表示此條件必須滿足,上一段**裡,全都是must,說明針對不同query的搜尋結果集取交集。除了must,還可以設定為must_not,should,這兩者都很好理解,分別表示條件必須不滿足和條件可滿足。不同的條件要求組合,可以實現結果集之間的並、交等組合。    

Lucene分頁查詢

個人認為最好每一次分頁導航都執行一次新的 查詢。color red lucene舊版本中常用方法 color hits中儲存的並不是真正的document,因此可以通過hits.doc index 的方式取出在一定範圍內的document。在獲 得hits後可以用類似下面的方法進行分頁處理 priv...

Lucene查詢語法

一 模糊查詢 term modifiers lucene支援在term中使用萬用字元來支援模糊查詢。wildcard searches 類 org.apache.lucene.search.wildcardquery lucene支援單個或者多個字元的萬用字元查詢,匹配單一字元使用符號 匹配多個字元...

lucene的學習 範圍查詢

對於lucene的範圍查詢,可以使用rangquery,或者使用rangfilter。但對於rangquery有個缺點,可能導致異常toomanyclause異常。因為對於不同的query,最後都是轉化為termquery.而rangquery,就是將這個範圍內的所有term 每乙個term就是乙個...