首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Lucene 实例教程(4)之检索方法总结

2013-10-08 
Lucene 实例教程(四)之检索方法总结原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者

Lucene 实例教程(四)之检索方法总结
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。
作者:永恒の_☆ 地址:http://blog.csdn.net/chenghui0317/article/details/10824789一、 前言

       前面简单介绍了如何使用Lucene删除索引和修改索引的操作,这样子避免了索引文件的累加会产生脏数据或者数据重复 ,地址:http://blog.csdn.net/chenghui0317/article/details/10366255

       在项目实战中,这还不能完全解决一些比较棘手的问题,比如:

       1、前面只提供了一种打开索引文件的方式 和 一种 实现全文检索的方式,检索方式的单一性不能根据检索条件权衡筛选最优检索方式;

       2、并且在检索的时候还有一点排序上的瑕疵,最优匹配的document对象并没有显示在最上面, 以及 无法实现对索引结果的操作。

       接下来介绍几中检索索引的方式,比如多字段搜索、多条件搜索、模糊搜索、前缀搜索、使用过滤器过滤查询等等,使用了这些方式之后,可以更好的理解Lucene的执行原理和检索方式的多样化。 其中的好处还需要慢慢去理解和体会。


二、使用Lucene实战


1、通过QueryParser绑定单个字段来检索索引记录

    这是一种最为简单的查询方式,首先封装好QueryParser这个查询转换器,然后根据关键字封装查询对象,这个做好之后交给IndexSearch就可以返回结果了。

具体代码如下:

控制台输出显示都是满足检索条件的结果。

需要注意的是:

    <1> 添加索引时用的什么分词器,那么检索的时候也必须使用这个分词器,否则查询不到任何记录。因为插入索引的时候是按照分词器规则插入的,所以检索的时候会以这种规则为匹配方式;

    <2> 由于次查询方式是使用的标题为查询条件,所以内容中出现的任何字符不会作为匹配元素。如果要使用多字段作为查询条件那么就要使用MultiQueryParser绑定多个字段封装Query查询对象了。


2、通过MultiQueryParser绑定多个字段来检索索引记录这种实现方式较QueryParser 的区别在于,构造方法中的第二个参数由原先的String变成了String[] ,这就表示可以使用多字段的数组了。

具体代码如下:


这次使用的是多字段检索,所以两个字段都会去匹配,根据上面结果,最优匹配的第一条记录并没有第二条出现的多,可能是这样:

因为是多字段匹配,那么两个字段都要匹配到,上面传递的"沪K"关键字都要在title和content中出现才算最优匹配。所以出现了上面结果。

如果要使用排序可以使用Sort的有参数构造方法,

里面传递SortField的实例,参数个数无上限,需要说明的是它的构造方法

    public SortField(String field, int type, boolean reverse)

第一个是字段名,第二个是字段的类型,第三个是排序的升降序,true表示升序,false表示降序,如果不指定默认是false

现在使用title作为排序字段降序排列,具体效果如下:

Lucene 实例教程(4)之检索方法总结

上图显示的结果是根据title降序排列的。

需要说明的是:

<1>实际开发如果是全文检索就不建议使用排序,因为排序会导致最优匹配的结果错乱,但是如果是使用单个字段查询的话 倒是没有问题。


3、通过Term绑定字段检索索引记录这种实现方式主要是通过Term组合查询,具体代码如下:

Lucene 实例教程(4)之检索方法总结

综合所有的因素考虑:既然用起来不方便所以要慎用。


4、通过wildcard使用通配符组合检索索引记录

这种实现方式主要是可以像sql语句一样使用通配符来查询想要的结果,具体代码如下:

其实这种实现方式非常非常的好,但是就是不支持英文和数字,就太不友好了。


5、通过prefix作为前缀组合检索索引记录

通过前面使用了WildcardQuery通配符的配置之后,现在这种查询方式显得有点多余的感觉。


6、通过filter过滤条件组合检索索引记录

使用这种过滤器先封装查询对象,然后过滤满足条件的结果显示出来,并且这种过滤方式支持多条件,具体代码如下:

由此可见,所有的过滤条件都满足了才会被匹配到结果集中显示。


7、通过boolean检索索引记录

这种实现方式主要是讲多个query查询对象进行筛选,这里包括三种方式:

    <1>取出他们共同的部分,即条件都满足的才会匹配;

    <2>取出他们不同的部分,即条件必须不满足的才会匹配;

    <3>取出他们所有部分,即满足任何一个条件即可的就可以匹配。

具体实现代码如下:


其实,booleanQuery的效果和filterQuery效果差不多,都是将所有的Query返回的交集记录整合在一起记录,也就是条件都要满足才行。这里的前提是使用BooleanClause.Occur.MUST这个“必须满足的”参数;

如果是使用BooleanClause.Occur.SHOULD 返回的是所有的Query返回的并集集合在一起的记录
而使用BooleanClause.Occur.MUST_NOT表示 必须没有,这里的查询条件中必须不能出现在最终返回的结果中。


那么,Lucene提供的几种常用的检索方式就介绍完了,最终这些检索方式好不好用还取决于自己去尝试之后,慢慢体会才能体会和领悟。

热点排行