通过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里。哎,还真的不太好发现。
分享到:
相关推荐
Lucene多个group by字段实现,字段个数动态。
一步一步跟我学习lucene是对近期做lucene索引的总结,
lucene.net,搜索引擎,锤子搜索引擎分组统计
我的博客专栏http://blog.csdn.net/wuyinggui10000/article/category/3173543,希望大家关注
NULL 博文链接:https://iamyida.iteye.com/blog/2202651
Lucene(这里用到的是Lucene.net版本也成为DotLucene)是一个...本源码演示了Lucene结合Sql建立索引,把Sql中的数据通过建立索引用Lucene来检索 支持简单的中文分词,同时提供了Lucene.Net-2.0-004版本的源码给大家
lucene的查询语法事例.
Lucene.net分组
Lucene+MySql/Sqlserver2005 例子,自己在学习lucene的过程中,做了这个小列子,是根据数据库的内容来创建索引,里面包括对查找的关键字进行高亮,对现实的内容进行了限定.对Lucene还没有进入深入的理解,里面的代码...
本源码演示了Lucene结合Sql建立索引,把Sql中的数据通过建立索引用Lucene来检索 【该源码由51aspx提供】 源码 " onerror="this.src='/images/ifnoimg.gif'" src="/uploads/allimg/090904/1039152O5-0.jpg...
lucene 通过FieldCache 实现分组统计 附完整代码
lucene与sqlserver数据库实现索引的简单实例lucene与sqlserver数据库实现索引的简单实例
用于测试库,用来使用和了解elasticsearch的功能。如果有其他测试与调试需要也可以使用,sql文件中会创建一个产品表并插入大量数据。
Lucene3.0之查询处理(1):原理和查询类型 各种Query对象详解
文件包含了lucene的创建、删除、修改、组合条件查询、类似mysql中like、in、or、以及时间范围条件查询
lucene facet查询示例,区间查询多dim查询,key-field-value模型了解
Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。
3.使用了较新的Lucene.net,目前是3.0版本 4.使用了最后一版盘古分词(2016年版本) 5.使用Winform+webBrowser实现(webBrowser负责显示结果) 使用方式: 1.新建数据库,然后在新建的数据库中执行附件根目录的sql...
Lucene与SQL对比学习,适用于新手
这是用Lucene.NET结合Sql建立全文检索Demo的源码,适合初学者学习Lucene,其中包含所需的DLL文件。