天天看點

艾偉_轉載:Lucene提供的條件判斷查詢

第一、按詞條搜尋 - TermQuery

query = new TermQuery(new Term("name","word1"));

hits = searcher.search(query);

這樣就可以把 field 為 name 的所有包含 word1 的文檔檢索出來了。

第二、“與或”搜尋 - BooleanQuery

它實際是一個組合 query 看看下面的代碼: 

query1 = new TermQuery(new Term("name","word1"));

query2 = new TermQuery(new Term("name","word2"));

BooleanQuery query=new BooleanQuery();

query.add(query1, BooleanClause.Occur.MUST);

query.add(query2, BooleanClause.Occur.MUST);

其中的MUST、SHOULD、MUST_NOT表示與、或、非 ,從字面意思很容易了解

Lucene 可以最多支援連續 1024 的 query 的組合。

第三、 在某一範圍内搜尋 - RangeQuery

IndexSearcher searcher = new IndexSearcher("F:\資源\lucene研究\test");

Term beginTime = new Term("time","200001");

Term endTime = new Term("time","200005");

Hits hits = null;

RangeQuery query = null;

query = new RangeQuery(beginTime, endTime, false);

RangeQuery 的構造函數的參數分别代表起始、結束、是否包括邊界。這樣我們就可以按照要求檢索了。

第四、 使用字首檢索 - PrefixQuery

這個檢索的機制有點類似于 indexOf() 從字首查找。這個常在英文中使用,中文中就很少使用了。代碼如下:

Term pre1 = new Term("name", "Da");

query = new PrefixQuery(pre1);

第五、 多關鍵字的搜尋 - PhraseQuery

可以多個關鍵字同時查詢。使用如下:

query = new PhraseQuery();

query.add(word1);

query.add(word2);

query.setSlop(0);

printResult(hits, "'david' 與 'mary' 緊緊相隔的 Document");

query.setSlop(2);

printResult(hits, "'david' 與 'mary' 中相隔兩個詞的短語 ");

這裡我們要注意 query.setSlop(); 這個方法的含義。

query.setSlop(0); 緊緊相連 (這個的條件比較苛刻)

query.setSlop(2); 相隔。

第六、 使用短語綴搜尋 - PharsePrefixQuery

使用 PharsePrefixQuery 可以很容易的實作相關短語的檢索功能。

執行個體:

query = new PhrasePrefixQuery();

// 加入可能的所有不确定的詞

Term word1 = new Term("content", "david");

Term word2 = new Term("content", "mary");

Term word3 = new Term("content", "smith");

Term word4 = new Term("content", "robert");

query.add(new Term[]{word1, word2});

// 加入确定的詞

query.add(word4);

printResult(hits, " 存在短語 'david robert' 或 'mary robert' 的文檔 ");

第七、 相近詞語的搜尋 - fuzzyQuery

可以通俗的說它是一種模糊查詢。

FuzzyQuery query = null;

query = new FuzzyQuery(word1);

printResult(hits," 與 'david' 相似的詞 ");

第八、 使用通配符搜尋 - WildcardQuery

Term word1 = new Term("content", "*ever");

Term word2 = new Term("content", "wh?ever");

Term word3 = new Term("content", "h??ever");

Term word4 = new Term("content", "ever*");

WildcardQuery query = null;

query = new WildcardQuery(word1);

printResult(hits, "*ever");

query = new WildcardQuery(word2);

printResult(hits, "wh?ever");

query = new WildcardQuery(word3);

printResult(hits, "h??ever");

query = new WildcardQuery(word4);

printResult(hits, "ever*");

由上可以看出通配符?代便 1 個字元, * 代表 0 到多個字元。 

Lucene 現在支援以上八中的搜尋方式,我們可以根據需要選擇适合自己的搜尋方式。當然上面提供的一些可能對英文還是比較有效,中文就不可取了,是以我們開始想想百度,我們隻在一個輸入框中搜尋結果。有了這個疑問我們揭開下一章的讨論吧!

查詢字元串的解析:這個就是我們經常在一個輸入框中輸入我們要檢索的文字,交給搜尋引擎去幫我們分詞。 

QueryParser 類就是對查詢字元串的解析類。 

看看它的用法:

query = QueryParser.parse(key1, "name", new StandardAnalyzer());

它直接傳回一個 Query 對象。需要傳入的參數分别是:

使用者需要查詢的字元串、需要檢索的對應字段名稱、采用的分詞類。

Analyzer analyzer = new CJKAnalyzer();

String[] fields = {"filename", "content"};

Query query = MultiFieldQueryParser.parse(searchword, fields, analyzer);

Hits hits = searcher.search(query);

QueryParser 的“與” 和 “或”:

QueryParser 之間預設是或,我們想改變為與的話加入以下代碼:

QueryParser.setOperator(QueryParser.DEFAULT_OPERATOR_AND);

就可以了。