对于搜索引擎(比如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实例在对用户输入进行扫描时,就会用空格分开的关键字理解为“与”,其实也就是构建了一个“与”关系的布尔型查询。

lucene-查询query->QueryParser的更多相关文章

  1. Lucene 查询(Query)子类

    QueryParser(单域查询) QueryParser子类对单个域查询时创建查询query,构造方法中需要传入Lucene版本号,检索域名和分词器. QueryParser parser = ne ...

  2. lucene查询索引之QueryParser解析查询——(八)

    0.语法介绍:

  3. Lucene查询索引(分页)

    分页查询只需传入每页显示记录数和当前页就可以实现分页查询功能 Lucene分页查询是对搜索返回的结果进行分页,而不是对搜索结果的总数量进行分页,因此我们搜索的时候都是返回前n条记录 package c ...

  4. 第六步:Lucene查询索引(优化一)

    package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...

  5. 第六步:Lucene查询索引

    package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...

  6. lucene 查询的使用

    各种查询方式一:使用QueryParser与查询语法.(会使用分词器) MultiFieldQueryParser查询字符串 ------------------------> Query对象 ...

  7. Lucene自定义扩展QueryParser

    Lucene版本:4.10.2 在使用lucene的时候,不可避免的需要扩展lucene的相关功能来实现业务的需要,比如搜索时,需要在满足一个特定范围内的document进行搜索,如年龄在20和30岁 ...

  8. lucene 查询 (转载)

    原网址:http://hi.baidu.com/lszhuhaichao/blog/item/ccffc7cb858f1514bf09e66f.html Lucene3.0之查询处理(1):原理201 ...

  9. Lucene查询结果高亮

    检索结果高亮 实现效果: 核心代码 package ucas.ir.lucene; import java.io.File; import java.io.IOException; import ja ...

  10. Lucene查询索引

    索引创建 以新闻文档为例,每条新闻是一个document,新闻有news_id.news_title.news_source.news_url.news_abstract.news_keywords这 ...

随机推荐

  1. AC日记——石头剪刀布 openjudge 1.6 08

    08:石头剪刀布 总时间限制:  1000ms 内存限制:  65536kB 描述 石头剪刀布是常见的猜拳游戏.石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负. 一天,小A和小B正好在 ...

  2. 2016年秋季的我,work with hololens

  3. red5安装时候出现服务不能启动异常

    Exception java.lang.ClassCastException: org.slf4j.helpers.BasicMDCAdapter cannot be cast to ch.qos.l ...

  4. [No00004C]软件工程师的创业陷阱:接私活

    我本身是 Java 工程师出身,写代码至今已超过 15 年,创业也超过 10 年,曾经外包过很多项目给别人,也接过很多外包的项目,现在不接了,只经营电子报发送平台,在二年内累积超过 5000 家企业用 ...

  5. 利用MySQL存储过程分割字符串

    (转)http://tec.5lulu.com/detail/104krn1e6p2w78d77.html 现有一段字符串,如apple,banana,orange,pears,grape,要把它按照 ...

  6. JQuery 获取touchstart,touchmove,touchend 坐标

    JQuery写法: $('#id').on('touchstart',function(e) { var _touch = e.originalEvent.targetTouches[0]; var ...

  7. 统计:P值 & α值

    来源:知乎:P值与α值的关系 一楼 P是"拒绝原假设时犯错误概率"又或者说是"如果你拒绝掉原假设实际上是在冤枉好人的概率". 不管怎么表达理解上都有点绕,所以你 ...

  8. Castle IOC容器与Spring.NET配置之比较

    我本人对于Spring.NET并不了解,本文只是通过一个简单的例子来比较一下两者配置之间的区别.在Castle IOC容器中,提出了自动装配(Auto-Wiring)的概念,即由容器自动管理组件之间的 ...

  9. 转:windows命令行下如何查看磁盘空间大小

    转自:http://www.cnblogs.com/hanxianlong wmic DiskDrive get Size /value ::查看C盘 wmic LogicalDisk where & ...

  10. Linux时间函数之gettimeofday()函数之使用方法

    1.简介: 在C语言中可以使用函数gettimeofday()函数来得到时间.它的精度可以达到微妙 2.函数原型: #include<sys/time.h> int gettimeofda ...