【elasticsearch】ES去重查询实现

这篇具有很好参考价值的文章主要介绍了【elasticsearch】ES去重查询实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

去重实现原理: 采用es 的Collapse折叠+cardinality基数计算 实现去重
1、优点:简单快速效率高,几乎无性能损耗(相比于分桶去重)
2、缺点:
1)Collapse折叠只支持一个字段去重,且字段必须是 keyword
2)cardinality基数计算去重后数量 (采用hyperloglog实现,hyperloglog一种近似计算)会有误差,
3) 不支持search_after 和 scroll,有深度分页问题

1、单个字段去重

GET /xxxxx/_search
{  "_source": [   //查询显示的字段
        "title",
        "uuid",
        "id"
      ],
   "query": {
    "match_phrase": {
      "title": "去重查询"
    }
  },
  "sort": [
    {
      "id.keyword": {
        "order": "desc"
      }
    }
  ],
  "collapse": {  
    "field": "uuid.keyword",//折叠字段,即 去重字段(折叠只支持一个字段)
    "inner_hits": {   //内部查询可以省略
      "name": "inner_tops",//内部查询的名字
      "size": 2,       //折叠项 取几个
      "sort": [    //折叠 内部排序字段
        {
          "id.keyword": "desc"
        }
      ],
      "collapse": { "field": "title.keyword" },//二次折叠
      "_source": [   //内部查询显示的字段
        "title",
        "uuid",
        "id"
      ]
    }
  },
  "aggs": {
    "total_size": {   //聚合桶名称
      "cardinality": {  //折叠 total 数量不发生变化,采用cardinality 获取总数量
        "field": "uuid.keyword" 
        "precision_threshold": 100   //精确度,0-40000 
      }
    }
  },
  "track_total_hits":true  //返回所有条数结果,默认返回10000
}
java API
//折叠和cardinality   去重 查询
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
AggregationBuilder aggregation = AggregationBuilders.cardinality(“total_size”).field("uuid.keyword");
searchSourceBuilder.aggregation(aggregation);

Aggregations aggregations = searchResponse.getAggregations();
Cardinality cardinality = aggregations.get(“total_size”);
System.out.println(cardinality.getValue())
   Elasticsearch 8.0+ 新版api 
   BoolQuery.Builder boolQuery = new BoolQuery.Builder();
   SearchResponse<JSONObject> search = elasticsearchClient.search(builder ->
                                builder.index(EsIndexConstants.INDEX_NAME).query(q ->
                                                q.bool(boolQuery.build()))
                                        .from(start)
                                        .size(requestInfo.getPageSize())
                                        .collapse(new FieldCollapse.Builder().field("uuid.keyword").build())
                                        .sort(s -> s.field(f -> f.field("publish_time").order(SortOrder.Desc))
                                       	//
                                        .aggregations("total_size", a-> a.cardinality(b->b.field("uuid.keyword").precisionThreshold(100))
                                        )
                                        .trackTotalHits(t -> t.enabled(true))
                        , JSONObject.class);
 //获取折叠后的总数                       
long totalSize=search.aggregations().get("total_size").cardinality().value();

2、多个字段去重
将多个字段组合成 一个字段然后去重
多个字段组合成一个字段有3种方案
1)写入的时候组合
2)采用pinpline
3)采用script 脚本文章来源地址https://www.toymoban.com/news/detail-734911.html

到了这里,关于【elasticsearch】ES去重查询实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch进阶:一文全览各种ES查询在Java中的实现

    ElasticSearch进阶:一文全览各种ES查询在Java中的实现 es基本语句详解 查询语句详解 ElasticSearch第一篇: ElasticSearch基础:从倒排索引说起,快速认知ES 完整项目已上传至:ElasticSearch Demo 项目,该项目是关于springboot的集成项目,ElasticSearch部分请关注【elasticSearch-demo】模块。觉得

    2024年02月02日
    浏览(43)
  • es 使用 cardinality + collapse做分页去重查询

    1.首先我们来介绍一下cardinality的用法 cardinality 即去重计算,类似sql中 count(distinct),先去重再求和,计算指定field值的种类数。 可以看到,aggregations聚合下,返回了按名字查询去重后的结果数,但是只有去重后的条数,没有具体的数据。 2.接下来我们再看一下collapse的用法

    2024年02月01日
    浏览(31)
  • ES(Elasticsearch)+SpringBoot实现分页查询

    1.ES介绍   ES作为一个搜索工具,寄托于Lucene之上,提供了方便的数据存储和搜索服务,一般的用它来作为网页数据索引以及存储用户画像(即用户标签)数据,可以提供复具有复杂的查询条件的服务。例如在网页索引中,通过倒排的方式索引的方式,对文档进行分词存储,

    2024年02月16日
    浏览(37)
  • java使用ElasticSearch的scroll查询,高效的解决es查询数量的限制。

    (1)首先我们要明白es的查询机制:ES的搜索是分2个阶段进行的,即 Query阶段和Fetch阶段 。 Query阶段 比较轻量级,通过查询倒排索引,获取满足查询结果的文档ID列表。 Fetch阶段 比较重,需要将每个分片的查询结果取回,在协调结点进行 全局 排序。 通过From+size这种方式分批

    2024年02月03日
    浏览(70)
  • ElasticSearch入门:使用ES来实现模糊查询功能

    本文针对在工作中遇到的需求:通过es来实现 模糊查询 来进行总结;模糊查询的具体需求是:查询基金/A股/港股等金融数据,要求可以根据 字段 , 拼音首字母 , 部分拼音全称 进行联想查询;需要注意的是,金融数据名称中可能不止包含汉字,还有英文,数字,特殊字符等

    2023年04月09日
    浏览(37)
  • Elasticsearch“滚动查询“(Scrolling)的机制的与Java使用ES Client 调用滚动查询

    ES在进行普通的查询时,默认只会查询出来10条数据。我们通过设置es中的size可以将最终的查询结果从10增加到10000。如果需要查询数据量大于es的翻页限制或者需要将es的数据进行导出又当如何? Elasticsearch提供了一种称为 \\\"滚动查询\\\"(Scrolling) 的机制,用于处理大型数据集的

    2024年02月11日
    浏览(34)
  • ElasticSearch如何使用以及java代码如何查询并排序ES中的数据(距离排序)

    import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.common.unit.

    2024年04月12日
    浏览(38)
  • ElasticSearch(7.8版本)聚合查询使用javaHighLevelRestClient实现(从MySQL聚合查询概念->ES聚合概念及实操)

    申明:本文是在实现ES聚合功能中,将过程中查找的多篇博客文献拼接在一起,参考到的博文全部在标题中附上了原文的超链接,分享出来仅是为了提做一个笔记以防忘记,并给大家提供一个参考。 聚合操作指的是在数据查找基础上对于数据进一步整理筛选行为,聚合操作也

    2023年04月24日
    浏览(45)
  • 【Elasticsearch】ES精确查询和范围查询,ES时间字段排序实例,ES倒排索引介绍

    termQuery matchQuery 模糊查询 multiMatchQuery 多个字段模糊查询 如果时间字段写入时用的类型是Text,可以用“时间字段.keyword”来处理 #查询前传入分页参数 #分页后拿到总记录数 把文档D对应到的映射转换为到文档ID的映射,每个都对应着一系列的文档,这些文

    2024年02月15日
    浏览(97)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包