Lucene的組合查詢

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

1.使用MultiFieldQueryParser       

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

             MultiFieldQueryParser parser=new MultiFieldQueryParser(new String[]{"name","content"},new StandardAnalyzer());

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

             Query query=parser.parse(keyword);


2.使用filter

    使用QueryFilter實現在搜索結果中再查找。關鍵語句如下:

       Query query = queryParser.parse(keyword2.trim());
       Query oldQuery = queryParser.parse(keyword1.trim());
       QueryFilter oldFilter = new QueryFilter(oldQuery);
       CachingWrapperFilter filter = new CachingWrapperFilter(oldFilter);

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

   例如,搜索關鍵字是“博客”、”wauwa“,那麼搜索出來的結果是同時包含”博客“和”wauwa“的文章。


3.使用boolean query

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

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

    比如,存放文件內容的field是”content“,現在需要在content中查找同時包含多個關鍵字的文章,關鍵字存在String 數組strb[i]中,實現語句如下:

   

    // 構造一個布爾查詢
      BooleanQuery Bquery = new BooleanQuery();

    for(int i=0;i<keywordnum;i++){
    Query query=parser.parse(strb[i]);

    // 添加子查詢
    Bquery.add(query, BooleanClause.Occur.MUST);

}

    先構造一個布爾查詢,在爲每個關鍵字創建一個query,再把這個query添加到布爾查詢中,查詢時向searcher傳入Bquery即可。

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

    BooleanClause.Occur.MUST中的MUST表示此條件必須滿足,上一段代碼裏,全都是MUST,說明針對不同query的搜索結果集取交集。除了MUST,還可以設置爲MUST_NOT,SHOULD,這兩者都很好理解,分別表示條件必須不滿足和條件可滿足。不同的條件要求組合,可以實現結果集之間的並、交等組合。    


轉載:http://blog.csdn.net/wauwa/article/details/8027439

發佈了9 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章