Lucene:QueryParser
作为lucene的Query工具,QueryParser却是最重要的一个。简单的说,QueryParser能够根据用户的输入来进行解析,自动构建合适的Query对象。下面简单总结一下它的实现:
目录
- 用户输入
- QueryParser的初始化
- 短语和QueryParser
- QueryParser的模糊匹配查询
- 通配符与QueryParser
- QueryParser指定Field查询
- QueryParser的范围RangeQuery查询
- QueryParser的多域MultiFieldQueryParser查询
1、用户输入(词条的定义)
当用户输入要查询的关键字串后,QueryParser首先会对其进行解析,而这种解析是以词条为基础的。而词条和词条之间呢,则是用空格分开的。
2、QueryParser的初始化
逻辑运算符“AND,OR,NOT”

1 String field = “bookname”;//设置一个默认的field
2 String queryStr = “Persist Google”;//用户输入的关键字
3
4
5 //new了一个QueryParser,并且传进去两个参数。
6 //第一个参数是默认要检索的field;(因为在用户没有指定field时,lucene会在默认的field中检索)
7 //第二个参数是用到的分析器;(注意:这里的分析器一定要使用建立索引时的分析器,否则所分词条与索引中的内容不一致,最终导致错误出现!)
8
9 QueryParser parser = new QueryParser(field,new StandardAnalyzer());
10
11 Query q = parser.parser(queryStr);//执行QueryParser的parser方法

在这里,我们(用户)所输入的“Persist Google”被QueryParser分析成了“OR”的关系,即检索有“Persist”或者“Google”的文档。这并非我们的意愿,我们要查的是同时含有“Persist”和“Google”文档。那么我们尝试改变一下QueryParser默认的布尔逻辑。
1 //上面的代码中只需要加上下面语句即可实现。
2 parser.setDefaultOperator(QueryParser.AND_OPERATOR);
或者,将用户输入的关键字串“Persist Google”改为“Persist AND Google”也可以实现上述要求。
3、短语和QueryParser
我们输入几个词,QueryParser就会把它解成几个词条。那么当我们输入一句话的时候,(如:Rome is not built in one day)此时这句话有七个词,我们并不想把它分成几个词来查询,怎么办呢?当然,lucene的开发者早已经想到了这点,也很人性化的解决了这一个问题,他们说:“给这句话加个引号吧!”。
1 //我们则只需要将代码
2 String queryStr = “Rome is not built in one day”;
3
4 //改为如下代码即可。
5 String queryStr = “/"Rome is not built in one day/””;
4、QueryParser的模糊匹配查询
FuzzyQuery(即模糊匹配)查询。它的用法与其他Query对象却是大同小异的。不同的是,FuzzyQuery有一个相似度的概念。我们不需要深刻理解,只需要知道它会去匹配和输入词条相似的其他词条即可。
1 //如:FuzzyQuery默认的相似度为0.5
2 Term t = new Term(“bookname”, “work”);
3 FuzzyQuery query = new FuzzyQuery(t);
用QueryParser的概念对输入关键字进行分析,我们只需要给输入的关键字加一个符号。如:work~0.2,即把work相似度0.5改为了0.2
5、通配符与QueryParser

1 //在之前的Google中提到的通配符原理亦是如此。
2 Term t = new Term(“bookname”, “wor?”);
3 WildcardQuery q = new WildcardQuery(t);
4
5 //wor?可以被QueryParser识别,表示前三个字母为wor的词条。
6 //即有可能是word,work...

6、QueryParser指定Field查询
1 //此时回去检索发布时间为2010-12-5的所有文档,并且bookname为work
2 String queryStr = “work publishdate:2010-12-5”;
3 QueryParser parser = new QueryParser(“bookname”,new StandardAnalyzer());
4 Parser.setDefaultOperator(QueryParser.AND_OPERATOR);
5 Query query = parser.parser(queryStr);
7、QueryParser的范围查找(RangeQuery):TO
1 //找出发布日期从2010-12-01到2010-12-05的所有文档
2 String queryStr = “[2010-12-1 TO 2010-12-5]”;
3 QueryParser parser = new QueryParser(“bookname”,new StandardAnalyzer());
4 Parser.setDefaultOperator(QueryParser.AND_OPERATOR);
5 Query query = parser.parser(queryStr);
8、QueryParser的多域查询MultiFieldQueryParser

1 //如查询多个域, title和content, 要定义一个包含多域的数组
2 String[] fields = {"title","content"};
3 String queryStr=“计算机”
4 QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_36, fields, new StandardAnalyzer());
5 Query query = queryParser.parse(queryStr);

在Lucene中,还有很多搜索方式,如:多索引搜索MultiSearcher,多线程搜索ParalellMultiSearcher等。用法都基本类似,原理也大同小异,是比较好理解的。
值得关注的是多线程搜索ParalellMultiSearcher,因为若只有单个线程的话,多访问时,总要等上个线程结束,这样反馈时间是很慢的,这里就需要多线程搜索来提高效率。
以上所提到的所有方法都可以互相结合或者嵌套使用,对各种口味的用户都能给予满足,这也正是Lucene的灵活性。
Lucene:QueryParser的更多相关文章
- Lucene:基于Java的全文检索引擎简介
Lucene:基于Java的全文检索引擎简介 Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全文索引应用,而是是一个用J ...
- Lucene:基于Java的全文检索引擎简介 (zhuan)
http://www.chedong.com/tech/lucene.html ********************************************** Lucene是一个基于Ja ...
- 黑马_10 Lucene:全文检索
10 Lucene:01.全文检索基本介绍 10 Lucene:02.创建索引库和查询索引 10 Lucene:03.中文分析器 10 Lucene:04.索引库维护CURD
- Lucene:信息检索与全文检索
目录 信息检索的概念 信息检索技术的分类 全文检索与数据库查询对比 全文检索工具一般由三部分构成 全文检索中建立索引和进行检索的流程 索引里面究竟存什么 如何创建索引 如何对索引进行检索 Lucene ...
- Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)
一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...
- lucene.net 使用过程中的 几个注意事项(含termquery 和QueryParser 的区别)
几个注意事项1.建立索引时 插入的顺序(不设置document和字段的boost) 会影响到 查询结果的默认排序,建议:将最新生成的文章 最后建索引 这样 查询结果首先显示的是 最后插入的数据2.Bo ...
- Lucene学习笔记: 五,Lucene搜索过程解析
一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: ...
- lucene学习笔记:二,Lucene的框架
Lucene总的来说是: 一个高效的,可扩展的,全文检索库. 全部用Java实现,无须配置. 仅支持纯文本文件的索引(Indexing)和搜索(Search). 不负责由其他格式的文件抽取纯文本文件, ...
- Lucene学习总结之七:Lucene搜索过程解析
一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: ...
随机推荐
- opencv安装及学习资料
第一次装时win7+VS2010+opencv3.0,结果不成功,原因解压出来的没有vc10,可能新版本不在支持vc的旧版本了.所以换了VS2013+opencv3.0,比较经典的安装时VS2010+ ...
- 异步IO简介
最近想学习一下libevent,就先翻译一下libevent的官方文档吧. 英文原文链接:http://www.wangafu.net/~nickm/libevent-book/01_intro.ht ...
- 自动化工具word文档批量转html
企业有很多的科室,科室的每个人或多或少都会写一些文档,有些文档领导需要浏览,解决的办法是将编辑的文档打印出来,供领导浏览,或是为了节约企业成本,文档就在人与人这间或部门之间copy过来,copy过去. ...
- 无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型,原因为没有注册类
错误描述 e = {"无法将类型为"System.__ComObject"的 COM 对象强制转换为接口类型"OpcRcw.Da.IOPCServer" ...
- 浅谈Chrome V8引擎中的垃圾回收机制
垃圾回收器 JavaScript的垃圾回收器 JavaScript使用垃圾回收机制来自动管理内存.垃圾回收是一把双刃剑,其好处是可以大幅简化程序的内存管理代码,降低程序员的负担,减少因 长时间运转而带 ...
- IOS 企业版证书($299)In-House方式发布指南
一.明确几个概念 1.企业版IDP:即iOS Development Enterprise Program.注意是$299/Year那种,并不是$99/Year的那种. 2.In House:是只企业 ...
- sdk manager更新失败,显示Download interrupted: read timed out,应该如何解决?
今天开始第一天学习Android,就遇到一个大问题.sdk manager无法自动更新,总在提示超时!!! 经过网上查询发现问题原因是. 在利用android sdk manager更新时失败,具体情 ...
- iOS开发-网络框架-b
网络框架(以下称NJAFNetworking)是基于AFNetworking框架的简单封装,基本功能包括POST请求,GET请求,上传文件,下载文件,网络状态,缓存等. 为什么要使用NJAFNetwo ...
- PHP调试工具Xdebug安装配置教程
说道PHP代码调试,对于有经验的PHPer,通过echo.print_r.var_dump函数,或PHP开发工具zend studio.editplus可解决大部分问题,但是对于PHP入门学习的童鞋来 ...
- xamarin SimpleAdapter绑定出错问题
问题:今天在实验xamarin中SimpleAdapter绑定到ListView时,出现闪退的现象, 见图: 解决方法: SimpleAdapter中的构造函数public SimpleAdapter ...