`
xiangxingchina
  • 浏览: 520296 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

lucene的分组查询(类似sql的group by)的解决方法

阅读更多

通过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 group by" 指的就是在 Lucene 中实现基于特定字段的分组操作,类似于 SQL 中的 GROUP BY 子句。这使得用户能够按类别聚合文档,例如,根据作者、日期或其他分类标准来查看搜索结果。 在 Lucene 中,分组...

    lucene-queries-2.9.0.jar DuplicateFilter 源码

    lucene-queries-2.9.0.jar 内含有org.apache.lucene.search.DuplicateFilter. 可以帮助我们完成类似sql中的group by的查询。里面包含jar和源码以及maven开发需要的pom配置

    SQL2LuceneQueryBuilder+QOMImpl

    这一过程涉及对SQL语法的理解,包括条件语句(如WHERE子句)、连接操作(JOINs)以及排序和分组(ORDER BY和GROUP BY)。开发者需要对SQL的语法结构有深入理解,并且熟悉Lucene的查询模型,才能实现这种复杂的转换。...

    lucene-queries-2.9.0.jar DuplicateFilter

    lucene-queries-2.9.0.jar 内含有org.apache.lucene.search.DuplicateFilter. 可以帮助我们完成类似sql中的group by的查询。

    elasticsearch-sql-7.9.2.0(maven包)

    它支持了大部分标准SQL特性,包括SELECT、FROM、WHERE、GROUP BY、ORDER BY等,甚至支持JOIN操作。 Maven是一个项目管理和综合工具,它帮助Java开发者管理项目的构建、报告和依赖关系。在"elasticsearch-sql-7.9....

    elasticsearch-sql-5.4.3.0

    它支持多种 SQL 语句,包括 SELECT、INSERT、UPDATE、DELETE,以及 JOIN、GROUP BY、ORDER BY、LIMIT 等复杂的查询操作。这样,开发人员可以利用他们对 SQL 的深厚理解来与 Elasticsearch 进行交互,而无需学习新的...

    elasticsearch-sql-2.4.5.0.zip

    它支持大部分标准SQL语法,包括SELECT、FROM、WHERE、GROUP BY、ORDER BY等,同时也支持JOIN操作,尽管在分布式环境下JOIN的性能可能受到限制。此外,插件还支持聚合函数,如SUM、COUNT、AVG等,以及子查询和窗口...

    elasticsearch-sql-5.3.3.0.zip

    1. **SQL支持**:允许用户通过标准的SQL语句进行索引查询,包括SELECT、FROM、WHERE、GROUP BY、ORDER BY等基本操作,甚至支持JOIN和子查询。 2. **多数据源**:除了Elasticsearch外,该插件可能还支持与其他数据源...

    es-sql-site-chrome.zip

    1. **广泛兼容性**:支持多种SQL语法,包括SELECT、JOIN、GROUP BY、HAVING、LIMIT等,几乎涵盖了标准SQL的关键功能。 2. **实时查询**:由于ES的实时特性,所有查询操作都能立即返回结果,无需等待索引刷新。 3. **...

    基于Java Rest High Level Client的Elasticsearch-Sql组件【stalled】.zip

    支持的SQL语法包括但不限于SELECT、FROM、WHERE、GROUP BY、ORDER BY等,这为开发者提供了熟悉的查询方式。需要注意的是,虽然Elasticsearch-Sql尽力模拟关系型数据库的行为,但毕竟Elasticsearch是一种NoSQL系统,...

    hive_elasticsearch_sql面试_大数据面试文档.rar

    3. **分组与排序**:GROUP BY、ORDER BY、HAVING子句的应用。 4. **连接操作**:INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN的理解与应用。 5. **子查询与联接的比较**:何时选择子查询,何时选择联接。 6. **...

    Elasticsearch如何使用 Java 对索引进行 ESIQL 的查询.txt

    在Elasticsearch中,除了支持传统的JSON格式查询外,还提供了一种类似于SQL的语言——ESIQL(Elasticsearch SQL),用于更加直观地进行数据检索。本文将详细介绍如何使用Java语言来实现对Elasticsearch索引的ESIQL...

    开源项目-cch123-elasticsql.zip

    例如,SQL的SELECT语句可能对应于DSL中的`search`操作,WHERE子句转化为`query`部分,GROUP BY和ORDER BY则对应于`aggregations`和`sort`。 5. **项目结构**:“elasticsql-master”很可能代表了项目的源代码主分支...

    QueryDSL中文文档.zip

    2. **基础概念**:Q类的创建,查询构造的基本语法,如WHERE子句、JOIN操作、GROUP BY和HAVING子句等。 3. **查询操作**:如何使用QueryDSL进行选择(SELECT)、更新(UPDATE)和删除(DELETE)操作。 4. **条件...

    elasticsearch数据库

    这个插件提供了类似MySQL的语法,支持SELECT、FROM、WHERE、GROUP BY等标准SQL语句,降低了学习和使用的门槛。 ### 6. 数据分析与可视化 Elasticsearch不仅擅长搜索,还非常适合实时数据分析。结合Kibana(一个...

    querydsl

    6. **集合操作**:Querydsl 提供了一系列的集合操作符,如 `join()`, `where()`, `select()`, `groupBy()` 等,使得在代码中组合查询变得简单。 7. **函数和运算符**:Querydsl 支持各种数学、日期、字符串等函数和...

    querydsl-sample:示例QueryDSL项目,用于测试功能并重现问题

    4. **分组与排序**:使用`.groupBy()`进行分组,使用`.orderBy()`进行排序。 5. **子查询**:可以通过`.in()`或`.notIn()`方法使用子查询。 6. **连接查询**:支持`join()`, `leftJoin()`, `rightJoin()`, `outer...

    Integrar-QueryDSL-Spring:使用PostgreSQL数据库将QueryDSL与Spring Data JPA Hibernate集成

    QueryDSL是一个通用的查询框架,支持SQL、JDO、JPA、Lucene等多种数据访问技术。它的核心在于通过Java对象来构建查询表达式,避免了字符串拼接导致的错误和难以维护的问题。QueryDSL的使用使得代码更易于理解和测试...

Global site tag (gtag.js) - Google Analytics