Lucene提供的條件判斷查詢

作者: 周建軍  發布時間: 2009-12-08 17:46  閱讀: 6814 次  推薦: 2   原文鏈接   [收藏]  

第一、按詞條搜索 - 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);
hits
= searcher.search(query);

其中的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);
hits
= searcher.search(query);

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

第四、 使用前綴檢索 - PrefixQuery

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

 
IndexSearcher searcher = new IndexSearcher("F:\資源\lucene研究\test");
Term pre1
= new Term("name", "Da");
query
= new PrefixQuery(pre1);
hits
= searcher.search(query);

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

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

 
query = new PhraseQuery();
query.add(word1);
query.add(word2);
query.setSlop(
0);
hits
= searcher.search(query);
printResult(hits,
"'david' 與 'mary' 緊緊相隔的 Document");
query.setSlop(
2);
hits
= searcher.search(query);
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);
query.setSlop(
2);
hits
= searcher.search(query);
printResult(hits,
" 存在短語 'david robert' 或 'mary robert' 的文檔 ");

第七、 相近詞語的搜索 - fuzzyQuery
可以通俗的說它是一種模糊查詢。
實例:

 
Term word1 = new Term("content", "david");
Hits hits
= null;
FuzzyQuery query
= null;
query
= new FuzzyQuery(word1);
hits
= searcher.search(query);
printResult(hits,
" 與 'david' 相似的詞 ");

第八、 使用通配符搜索 - WildcardQuery
實例:

 
IndexSearcher searcher = new IndexSearcher("F:\資源\lucene研究\test");
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;
Hits hits
= null;
query
= new WildcardQuery(word1);
hits
= searcher.search(query);
printResult(hits,
"*ever");
query
= new WildcardQuery(word2);
hits
= searcher.search(query);
printResult(hits,
"wh?ever");
query
= new WildcardQuery(word3);
hits
= searcher.search(query);
printResult(hits,
"h??ever");
query
= new WildcardQuery(word4);
hits
= searcher.search(query);
printResult(hits,
"ever*");

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

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

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

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

看看它的用法:

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

它直接返回一個 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);
就可以了。

2
0
 
標簽:Lucene.Net
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()