通过lucene搜索去除相同结果。
在网上找了很久到没有答案,到apache看了文档,http://lucene.apache.org/java/2_4_1/queryparsersyntax.html
搜索语法之中是没有类似group by的。只好换个思路,想到了过滤器。
结果发现了org.apache.lucene.search.DuplicateFilter这个类。对此类的解释如下: "Full" processing mode starts by setting all bits to false and only setting bits for documents that contain the given field and are identified as none-duplicates. 这就是说这个过滤器可以保证搜索的唯一。这样就可以实现类似sql的group by(和group by还是有一定区别的,我想要的要求就是去除相同结果,但次方法经过修改也可实现group by 其他功能)。
多的不说了贴个例子自己研究下吧。
public static void main(String [] args) throws Exception{
RAMDirectory directory=new RAMDirectory();
IndexWriter writer=new IndexWriter(directory,new StandardAnalyzer(),true);
//数组中有3个重复值133700
String[] link ={"",
"shtml#Ayi:263791429",
"133700",
"133700",
"133700",
"#Ayi:468534543",
"#Ayi:-992539968",
"#Ayi:442193484"};
String[] parentLink={"110905.shtml",
"110905.shtml",
"110905.shtml",
"110905.shtml",
"905.shtml",
"5.shtml",
"110905.shtml",
"1"};
for (int i = 0; i < link.length; i++){
Document doc = new Document();
Field fields=new Field("link",link[i], Field.Store.YES, Field.Index.TOKENIZED);
doc.add(fields);
fields=null;
fields=new Field("plink","a"+i, Field.Store.YES, Field.Index.TOKENIZED);
doc.add(fields);
writer.addDocument(doc);
}
writer.optimize();
writer.close();
IndexSearcher indexSearcher=new IndexSearcher(directory);
QueryParser queryParser=new QueryParser("link",new StandardAnalyzer());
String xsfd="link:(133700)";
//实例化DuplicateFilter 参数为想要过滤的字段名
Filter filter = new DuplicateFilter("link");
Query query=queryParser.parse(xsfd);
Hits hits=indexSearcher.search(query,filter);
System.out.println(hits.length());
for(int j=0;j<hits.length();j++){
Document doc=(Document)hits.doc(j);
System.out.println(doc.get("link"));
}
}
注意:DuplicateFilter在lucene的核心包里并没有在lucene-queries-2.4.1.jar包中,找不到这个包就下个lucene源码在contrib\queries里。哎,还真的不太好发现。
分享到:
相关推荐
我的博客专栏http://blog.csdn.net/wuyinggui10000/article/category/3173543,希望大家关注
Lucene多个group by字段实现,字段个数动态。
lucene 通过FieldCache 实现分组统计 附完整代码
Lucene.net分组
文件包含了lucene的创建、删除、修改、组合条件查询、类似mysql中like、in、or、以及时间范围条件查询
用到的工具 jsoup+spring+struct+DButil+mysql+lucene 可以配置采集网站的图片,包含分组统计,相同数据合并功能,主要是给群内成员来个demo,让大家有个学习的demo 小试牛刀、临时写的,莫吐槽 需要用到mysql...
lucene-grouping-3.5.0.jar分组统计+分类统计插件 分组统计+分类统计
一步一步跟我学习lucene是对近期做lucene索引的总结,
lucene.net,搜索引擎,锤子搜索引擎分组统计
NULL 博文链接:https://zm603380946.iteye.com/blog/1827318
Lucene作为一个全文检索引擎... (5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search[11])、分组查询等等。
NULL 博文链接:https://iamyida.iteye.com/blog/2202651
lucene collector的使用 lucen分组统计 collector
lucene7.1.0所需jar包里面包含了24个jar包,提供给有需要的人
由于自身原因需要lucene4的grouping包,翻遍百度也没找到。后来去国外搜索引擎一查一大堆,网络有国界,我想说的你懂的。3分不多的。
主要介绍了使用Java的搜索工具Lucene对检索结果进行分组和分页的方法,Luence是Java环境中的一个全文检索引擎工具包,需要的朋友可以参考下
前几天项目需要做一个站内需求,做了一个sql全文检索,老板不满意,没有办法就上网搜了一下,看到了Lucene,可是不会java,只会C,最后才发下有.net的版本,小小的研究一下看着参考文档,做了一个简单的代码,自己把...
一个流畅的风格 api,用于处理大多数查询类型和分组的 lucene 查询。 基于Lucene的分页 基于Lucene的排序 查询方式(包括但不限于) - 名称(包括通配符)、直接模板、基本模板、祖先、父级、语言或任意组合 查询...
该文件里面包含有Lucene.net 的各种工具包,采用了盘古分词发进行分词
Lucene服务器该项目在 6.x... 单个节点可以为文档建立索引,通过DSL或解析的查询字符串运行近乎实时的搜索,包括“滚动”搜索,地理位置搜索,突出显示,联接,排序,索引时间排序,分组,构面等。 必须首先使用registe