您的位置:首页 > 产品设计 > UI/UE

lucene-查询query->QueryParser

2016-03-01 20:43 453 查看
对于搜索引擎(比如Google和百度)来讲,很多情况下只需要用户在输入框内输入所需查询的内容,然后再单击“搜索”就可以了,其余的事情全部交给搜索引擎去处理,最后搜索引擎会把检索到的结果显示出来。那么搜索引擎是怎样处理用户输入得符号串的呢?

在Lucene中,这项工作就交给了QueryParser类来完成,它的作用就是把各种用户输入的符号串转为一个内部的Query或者一个Query组。虽然Lucene提供的API允许使用者创建各种各样的Query(查询语句),但它同时也允许通过QueryParser(查询分析器)生成各种各样的Query子对象。这使得Lucene的查询功能更加灵活和强大。

QueryParser实际上就是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象,以下是一个代码示例:

Query query = null;

query = QueryParser.parse(keywords,fieldName,new StandardAnalyzer());


由上面代码可以看出,当使用QueryParser构建用户Query时,不仅需要用户输入关键字文本,还需要告诉QueryParser默认将在哪个字段内查找该关键字信息。当然,这并不是说用户只能在这个字段内查找关键字信息(例如可以在关键字中使用“content:david”这样的方式指定搜索字段“content”中的关键字),但是如果用户在输入的关键字中没有给出检索字段信息时,QueryParser就将在默认字段内进行检索。

用户输入关键字的格式以及QueryParser所理解的含义如表所示。

格 式

含 义

“David”

在默认的字段中检索“David”关键字

“content:David”

在“content”字段中检索“David”关键字

“David Mary”或“David OR Mary”

在默认字段中检索David和Mary关键字,它们是“或”关系

“+David +Mary”或“David AND Mary”

在默认字段中检索David和Mary关键字,它们是“与”关系

“content:David –title:Manager”或“content:David AND NOT title:Manager”

在content字段中包括关键字David但在title字段中不包含关键字Manager

“(David OR Mary) AND Robert”

在默认字段中包含David或Mary关键字,但一定要包含Robert关键字

Davi*

在默认字段中检索前缀为Davi

“content:"David is a manager"”

在“content”字段中包含短语“David is a manager”

另外很重要的一点,就是在使用QueryParser对用户的输入进行扫描时,还需要给它一个分析器。有关分析器的概念将在后面的章节中介绍。不过,当对用户输入的关键字进行分析时的分析器应当与建立索引时的分析器一样,这样才能保证分析成功。

QueryParser的“与”和“或”

通过表11-1可以了解,当用户输入两个关键字时,QueryParser默认它们之间的关系为“或”关系。如果用户需要改变这种逻辑关系,则可采用下面的方法:

QueryParser parser = new QueryParser(fieldName, new StandardAnalyzer());

parser.setOperator(QueryParser.DEFAULT_OPERATOR_AND);


这样构建的QueryParser实例在对用户输入进行扫描时,就会用空格分开的关键字理解为“与”,其实也就是构建了一个“与”关系的布尔型查询。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: