本文主要是介绍Lucene4.3开发之插曲之烽火连城,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
[b][color=red][size=x-large]转载请注明,原创地址,谢谢配合![url]http://qindongliang1922.iteye.com/blog/1938234[/url]
[/size][/color][/b]
[b][color=green][size=x-large]上次散仙给大家总结了Lucene中,一些常用Filter的用法和例子,今天,我们在来看下不在Filter家族中的一个特殊的filter,属于Lucene捐赠模块的特殊包中的类DuplicateFilter,这个filter的作用是用来对某个字段进行去重操作的,类似数据库中的Distinct关键字,可以实现对某个列的结果集去重,这个去重的字段,一般情况下是不建议分词的,因为分词后,可能去重效果不准确.[/size][/color][/b]
[b][color=green][size=x-large]举个例子,来说明分词后去重,会造成什么情况,假如我们的索引name一列中有中国,和伟大的中国,那么就对这个name列去重后,就会发现lucene只保留了伟大的中国这个字段,为什么呢?因为切词后伟大的中国会被分成伟大|的|中国,进行去重时,Lucene认为中国是重复的,而伟大的中国是不重复的,又因为伟大的中国里包含中国,所以最后的结果就会只保留伟大的中国,而没有中国。所以无论使用这个过滤器去重,还是使用grouping或fact去重,大多数情况下操作的字段是不能分词的,这一点需要注意![/size][/color][/b]
[b][color=green][size=x-large]下面我们来具体看下DuplicateFilter这个特殊的过滤器,怎么使用。在这之前我们先来看下我们简单的测试数据.[/size][/color][/b]
name===type
a===>中国
a===>法国
b===>中国
c===>英国
d===>英国
b===>英国
[b][color=green][size=x-large]分别对对name和type去重后的效果(注意一次只能去重一个字段)[/size][/color][/b]
a
c
d
b
法国
中国
英国
[b][color=green][size=x-large]下面给出具体的代码实现,需要额外导入的包[/size][/color][/b]
org.apache.lucene.sandbox.queries
[b][color=green][size=x-large]核心代码[/size][/color][/b]
//群交流 324714439
//String field="name";
String field="type";
DuplicateFilter filter=new DuplicateFilter(field);//去重过滤
Query q=new MatchAllDocsQuery();//对所有结果去重
TopDocs s=search.search(q, filter, 100);
[b][color=olive][size=x-large]可以看出,核心的代码量很少,却可以高效的完成去重工作,去重技术在我们的实际运用中也是一项很常用的技术,有时候我们可能只需要查看不重复的记录,而没有一些类似统计的功能,如果需要去重并统计个数,那么就需要使用分组功能或分面功能了,当然,如果我们只需要简单的对字段去重,那么就可以使用DuplicateFilter简洁高效的来完成这项任务。[/size][/color][/b]
[b][color=red][size=x-large]转载请注明,原创地址,谢谢配合!
[url]http://qindongliang1922.iteye.com/blog/1938234[/url]
[/size][/color][/b]
这篇关于Lucene4.3开发之插曲之烽火连城的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!