lucene.net 的查询方式query条件判断

第一、按词条搜索 - 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);


就可以了。