作为lucene的Query工具,QueryParser却是最重要的一个。简单的说,QueryParser能够根据用户的输入来进行解析,自动构建合适的Query对象。下面简单总结一下它的实现:

目录

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的灵活性。

最新文章

  1. 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
  2. Linux下查看系统版本号信息的方法
  3. jquery插件编写模版
  4. 【Android 应用开发】 ActionBar 样式详解 -- 样式 主题 简介 Actionbar 的 icon logo 标题 菜单样式修改
  5. Oracle数据库游标的类型
  6. jQuery也能舞出绚丽的界面(完结篇)
  7. linux php安装
  8. 图文详解AO打印(标准模式)
  9. sqlserver 查询 inner join 同一表2次 只出一条查询结果
  10. EBS R12安装升级(FRESH)(二)
  11. python之路day04--列表的增删改查,嵌套、元组的嵌套、range、for循环嵌套
  12. STM32F10x_StdPeriph_Lib_V3.5.0标准库文件关系(转载他人)
  13. systemd服务详解-技术流ken
  14. vue原理简介
  15. 20145319 《网络渗透》MS12_020安全漏洞
  16. 1.ehcache实现页面整体缓存和页面局部缓存
  17. C# 笔记——覆盖和重写
  18. Oracle11g:分区表数据操作出现ORA-14400异常处理
  19. javaEE开发之文件下载
  20. python爬虫之路——Python的re模块及其方法

热门文章

  1. 让div 实现 input效果
  2. SGU 119.Magic pairs
  3. SGU 156. Strange Graph(欧拉路)
  4. 内置方法+lambda是pythonic的利器
  5. iOS 获取项目名称及版本号
  6. BeanUtils的日期问题
  7. c# winform 设置winform进入窗口后在文本框里的默认焦点
  8. Bootstrap_Javascript_滚动监视器
  9. 谈谈 jQuery 中的防冲突(noConflict)机制
  10. Java包详解