通过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 中实现基于特定字段的分组操作,类似于 SQL 中的 GROUP BY 子句。这使得用户能够按类别聚合文档,例如,根据作者、日期或其他分类标准来查看搜索结果。 在 Lucene 中,分组...
lucene-queries-2.9.0.jar 内含有org.apache.lucene.search.DuplicateFilter. 可以帮助我们完成类似sql中的group by的查询。里面包含jar和源码以及maven开发需要的pom配置
这一过程涉及对SQL语法的理解,包括条件语句(如WHERE子句)、连接操作(JOINs)以及排序和分组(ORDER BY和GROUP BY)。开发者需要对SQL的语法结构有深入理解,并且熟悉Lucene的查询模型,才能实现这种复杂的转换。...
lucene-queries-2.9.0.jar 内含有org.apache.lucene.search.DuplicateFilter. 可以帮助我们完成类似sql中的group by的查询。
它支持了大部分标准SQL特性,包括SELECT、FROM、WHERE、GROUP BY、ORDER BY等,甚至支持JOIN操作。 Maven是一个项目管理和综合工具,它帮助Java开发者管理项目的构建、报告和依赖关系。在"elasticsearch-sql-7.9....
它支持多种 SQL 语句,包括 SELECT、INSERT、UPDATE、DELETE,以及 JOIN、GROUP BY、ORDER BY、LIMIT 等复杂的查询操作。这样,开发人员可以利用他们对 SQL 的深厚理解来与 Elasticsearch 进行交互,而无需学习新的...
它支持大部分标准SQL语法,包括SELECT、FROM、WHERE、GROUP BY、ORDER BY等,同时也支持JOIN操作,尽管在分布式环境下JOIN的性能可能受到限制。此外,插件还支持聚合函数,如SUM、COUNT、AVG等,以及子查询和窗口...
1. **SQL支持**:允许用户通过标准的SQL语句进行索引查询,包括SELECT、FROM、WHERE、GROUP BY、ORDER BY等基本操作,甚至支持JOIN和子查询。 2. **多数据源**:除了Elasticsearch外,该插件可能还支持与其他数据源...
1. **广泛兼容性**:支持多种SQL语法,包括SELECT、JOIN、GROUP BY、HAVING、LIMIT等,几乎涵盖了标准SQL的关键功能。 2. **实时查询**:由于ES的实时特性,所有查询操作都能立即返回结果,无需等待索引刷新。 3. **...
支持的SQL语法包括但不限于SELECT、FROM、WHERE、GROUP BY、ORDER BY等,这为开发者提供了熟悉的查询方式。需要注意的是,虽然Elasticsearch-Sql尽力模拟关系型数据库的行为,但毕竟Elasticsearch是一种NoSQL系统,...
3. **分组与排序**:GROUP BY、ORDER BY、HAVING子句的应用。 4. **连接操作**:INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN的理解与应用。 5. **子查询与联接的比较**:何时选择子查询,何时选择联接。 6. **...
在Elasticsearch中,除了支持传统的JSON格式查询外,还提供了一种类似于SQL的语言——ESIQL(Elasticsearch SQL),用于更加直观地进行数据检索。本文将详细介绍如何使用Java语言来实现对Elasticsearch索引的ESIQL...
例如,SQL的SELECT语句可能对应于DSL中的`search`操作,WHERE子句转化为`query`部分,GROUP BY和ORDER BY则对应于`aggregations`和`sort`。 5. **项目结构**:“elasticsql-master”很可能代表了项目的源代码主分支...
2. **基础概念**:Q类的创建,查询构造的基本语法,如WHERE子句、JOIN操作、GROUP BY和HAVING子句等。 3. **查询操作**:如何使用QueryDSL进行选择(SELECT)、更新(UPDATE)和删除(DELETE)操作。 4. **条件...
这个插件提供了类似MySQL的语法,支持SELECT、FROM、WHERE、GROUP BY等标准SQL语句,降低了学习和使用的门槛。 ### 6. 数据分析与可视化 Elasticsearch不仅擅长搜索,还非常适合实时数据分析。结合Kibana(一个...
6. **集合操作**:Querydsl 提供了一系列的集合操作符,如 `join()`, `where()`, `select()`, `groupBy()` 等,使得在代码中组合查询变得简单。 7. **函数和运算符**:Querydsl 支持各种数学、日期、字符串等函数和...
4. **分组与排序**:使用`.groupBy()`进行分组,使用`.orderBy()`进行排序。 5. **子查询**:可以通过`.in()`或`.notIn()`方法使用子查询。 6. **连接查询**:支持`join()`, `leftJoin()`, `rightJoin()`, `outer...
QueryDSL是一个通用的查询框架,支持SQL、JDO、JPA、Lucene等多种数据访问技术。它的核心在于通过Java对象来构建查询表达式,避免了字符串拼接导致的错误和难以维护的问题。QueryDSL的使用使得代码更易于理解和测试...