lucene-查询query->QueryParser
对于搜索引擎(比如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的更多相关文章
- Lucene 查询(Query)子类
QueryParser(单域查询) QueryParser子类对单个域查询时创建查询query,构造方法中需要传入Lucene版本号,检索域名和分词器. QueryParser parser = ne ...
- lucene查询索引之QueryParser解析查询——(八)
0.语法介绍:
- Lucene查询索引(分页)
分页查询只需传入每页显示记录数和当前页就可以实现分页查询功能 Lucene分页查询是对搜索返回的结果进行分页,而不是对搜索结果的总数量进行分页,因此我们搜索的时候都是返回前n条记录 package c ...
- 第六步:Lucene查询索引(优化一)
package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...
- 第六步:Lucene查询索引
package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...
- lucene 查询的使用
各种查询方式一:使用QueryParser与查询语法.(会使用分词器) MultiFieldQueryParser查询字符串 ------------------------> Query对象 ...
- Lucene自定义扩展QueryParser
Lucene版本:4.10.2 在使用lucene的时候,不可避免的需要扩展lucene的相关功能来实现业务的需要,比如搜索时,需要在满足一个特定范围内的document进行搜索,如年龄在20和30岁 ...
- lucene 查询 (转载)
原网址:http://hi.baidu.com/lszhuhaichao/blog/item/ccffc7cb858f1514bf09e66f.html Lucene3.0之查询处理(1):原理201 ...
- Lucene查询结果高亮
检索结果高亮 实现效果: 核心代码 package ucas.ir.lucene; import java.io.File; import java.io.IOException; import ja ...
- Lucene查询索引
索引创建 以新闻文档为例,每条新闻是一个document,新闻有news_id.news_title.news_source.news_url.news_abstract.news_keywords这 ...
随机推荐
- 编写 Unity Editor 插件
Editor Style Viewer 在开发过程中,我喜欢编写一些辅助的Editor插件,方便在游戏开发过程进行调试. 下面是摘自Asset Store的一个查看Unity 默认GUI样式的小工具 ...
- android gridview画分割线,如图:
1.先上图: 2.具体实现代码: public class LineGridView extends GridView { public LineGridView(Context context) { ...
- Oracle中的NVL函数
Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...
- Python的高级特性9:蹩脚的多态
学习了java再来看python的多态,总感觉怪怪的,很蹩脚.. 1.python的父类根本不能调用子类的方法,只能蹩脚的依靠重写方法,然后在运行时去调用,实现伪多态... 2.所谓的鸭子类型看起来很 ...
- header
本文分享几个php header函数的例子,有需要的朋友参考学习下. 转自:http://www.jbxue.com/article/php_header_x5hV63c.html 1,可以使用hed ...
- DPABI advanced edition 文件夹组织形式
❤ Regress out nuisance: ... csf\wm ('SPM apriori') {working directory}\Masks\WarpedMasks\SubIndex_Wh ...
- js jquery 关闭弹出页面 并刷新父页面(window.opener)
function Closepage() { if (window.opener && !window.opener.closed) { window.parent.opener.lo ...
- 恢复Reflector反编译后资源文件的办法
反编译问题: 1.路径问题:如果遇到了Path.Combine,有错误改下即可 2.资源文件问题: 在Reflector下,对左边的资源管理窗口的Resources文件夹下的资源文件,进行右键点击,选 ...
- GIT常用命令备忘
Git配置 git config --global user.name "storm" git config --global user.email "stormzhan ...
- sublime text2 打开包含中文的文件会自动追加.dump后缀解决办法
用sublime text2 打开.c, .h,.txt等文件会自动追加一个.dump后缀,這样在打开.c,.h等文件时无法正常识别,从而无法正常进行语法着色,网上说是因为安装了GBK Encodin ...