【Lucene4.8教程之六】QueryParser与Query子类:如何生成Query对象


一、概述

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、简单说明

在使用双引号将搜索关键字括起来,则将搜索关键词作为一个整体的短语进行搜索。如:




前者只有534个返回结果,后者有200多万返回结果。对于前者,将会搜索java 和sunshine之间的距离少于一个特定的slop值的文档。







posted @ 2014-06-22 09:35  eagleGeek  阅读(367)  评论(0编辑  收藏  举报