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);

就可以了。

本文来自CSDN博客:http://blog.csdn.net/hehui21/archive/2008/09/03/2874178.aspx

转载于:https://www.cnblogs.com/sophist/archive/2011/04/24/2026134.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值