第一、按词条搜索 - TermQuery
query = new TermQuery(new Term("name","word1"));
hits = searcher.search(query);
这样就可以把 field 为 name 的所有包含 word1 的文档检索出来了。
第二、 “与或”搜索 - BooleanQuery
它实际是一个组合 query 看看下面的代码:
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
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() 从前缀查找。这个常在英文中使用,中文中就很少使用了。代码如下:
Term pre1 = new Term( " name " , " Da " );
query = new PrefixQuery(pre1);
hits = searcher.search(query);
第五、 多关键字的搜索 - 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 可以很容易的实现相关短语的检索功能。
实例:
// 加入可能的所有不确定的词
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
可以通俗的说它是一种模糊查询。
实例:
Hits hits = null ;
FuzzyQuery query = null ;
query = new FuzzyQuery(word1);
hits = searcher.search(query);
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 ;
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