一、概述
1、对于一个搜索而言,其核心语句为:
searcher.search(query, 10);
此时,其最重要的參数为一个Qeury对象。构造一个Query对象有2种方法:(1)使用Query的子类创建一个对象。
(2)使用QueryParser.parse()创建一个对象。
经常使用的用于实例化一个对象的Query子类有下面13个:
TermQuery
BooleanQuery
WildcardQuery
PhraseQuery
PrefixQuery
MultiPhraseQuery
FuzzyQuery
RegexpQuery
TermRangeQuery
NumericRangeQuery
ConstantScoreQuery
DisjunctionMaxQuery
MatchAllDocsQuery
2、高速入门
【均以在contents域搜索java关键词为例】
(1)使用Query的子类。。直接实例化一个对外:
searcher.search( new TermQuery(new Term("contents","java")), 10);
下面语句结构更为清晰
Term term= new Term("contents","java");
TermQuery tq = new TermQuery(term);
searcher.search(tq , 10);
此外。即为在contents域中搜索包含java的文档。
(2)使用QueryParser的parse()方法,对所传入的搜索关键词汇进行解释,并返回query对象。
QueryParser parser = new QueryParser(Version.LUCENE_48, "contents",new SimpleAnalyzer(Version.LUCENE_48));
Query query = null;
try {
query = parser.parse("java");
} catch (ParseException e) {
e.printStackTrace();
}
TopDocs docs = searcher.search(query, 10);
以上语句创建一个QueryParser,其默认搜索域为contents,然后将搜索词汇转化为Query对象。
假设指定QueryParser的默认搜索域为所有?怎样指定一个Query的搜索域?
二、TermQuery
1、创建方式
上述高速入门中使用的就是TermQuery。
2、适用范围
(1)直接使用TermQuery,不正确搜索词作不论什么的分析,包含大写和小写都不作转换,而使用QueryParser,则能够依据Analyzer的类型作分析。
(2)TermQuery适合使用于全然匹配的搜索,如搜索id号。二维码。姓名等。
三、BooleanQuery
1、创建方式
(1)使用BooleanQuery
多个搜索条件组成BooleanQuey对象。以后补充样例。
(2)使用QueryParser
对于一个QueryParser,若其未指定是何种逻辑操作,则其将默觉得Operator.OR。因此,若搜索 java web,则其会觉得java OR web。
而对于中文,使用StandartAnalyzer分析器时,会将每一个字作为一个词汇。如搜索“学习”,则搜索“学 OR 习”。
因此,为指定搜索“学习”或者'java web"等,必须显示指定逻辑操作为Operator.AND。
QueryParser parser = new QueryParser(Version.LUCENE_48, "contents",
new StandardAnalyzer(Version.LUCENE_48));
parser.setDefaultOperator(Operator.AND);
Query query = parser.parse(term);
2、适用范围
(1)BooleanQuery方式。因为须要将搜索内容生成多个Query对象,再进行逻辑组合。因此,仅仅适用于依据多个搜索条件进行搜索的情形。
如:
在上述页面选择多个筛选条件,然后。每一个筛选条件生成一个Query对象,再将各个Query对象进行逻辑组合。
(2)QueryParser方式。适用于单一搜索框,使用自然语言进行搜索的情形。如google,百度等搜索框。
四、PhraseQuery
1、简单说明
在使用双引號将搜索keyword括起来,则将搜索关键词作为一个总体的短语进行搜索。如:
前者仅仅有534个返回结果,后者有200多万返回结果。对于前者,将会搜索java 和sunshine之间的距离少于一个特定的slop值的文档。