ES去重查询实现

这篇具有很好参考价值的文章主要介绍了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-503039.html

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

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

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

相关文章

  • golang实现es根据某字段分组,统计每组某一字段的数量,过滤空值并去重

    需求: 索引:dna 需求:根据app.Id分组,统计每组的OwnerBid数量,过滤空值并去重 dna索引结构 es查询语句 es查询结果 goalng实现 models.EsCountAgg 【面向校招】全力备战2023Golang实习与校招 欢迎进群交流:1007576722

    2024年02月17日
    浏览(45)
  • 自定义Collapse 折叠面板的下拉图标,以及切换数据渲染Collapse 时实现设置Collapse 默认全部关闭

    效果图: 1. 首先需要在折叠面板中绑定activeName,activeName用来装每个面板的唯一标识 2.在切换左侧规则时设置 activeNames 为空数组即可将全部的Collapse 设置为关闭状态 1.首先隐藏右侧的默认图标:审查元素可以看到右侧图标有自己的标签,直接隐藏掉(scoped下注意要用样式穿透

    2024年02月14日
    浏览(53)
  • 【ES实战】ES分页与去重

    介绍ES分页和ES去重的实现方式。 from + size 每次对结果集都是全面分页,数量少时可以用,10000条以内( index.max_result_window 的默认值)。对很占内存。10个一条 深度就是1000。控制分页的深度意在控制协调节点上的队列长度。 问题说明 一个有 5 个主分片的索引中搜索。 当我们请

    2023年04月25日
    浏览(36)
  • ES es Elasticsearch 十三 Java api 实现搜索 分页查询 复杂查询 过滤查询 ids查询 等

    目录 Java api 实现搜索 Pom.xml 建立链接 搜索全部记录 增加规则值查某些字段 搜索分页 全代码 Ids 搜索 搜索Match搜索 multi_match 搜索 多字段搜索 复杂查询 bool查询 filter  bool 复杂查询增加过滤器查询 复杂擦好像加排序 日志 思路 参考 api 写法 写Java代码 请求条件构建层次

    2024年02月04日
    浏览(58)
  • 利用ES6 Set去重

    方法一: 使用 Set 方法二: 使用 indexOf 方法三: 使用 includes 方法四: 使用 filter 方法五: 使用 reduce

    2024年04月16日
    浏览(38)
  • ES根据得分数聚合去重

    2024年02月11日
    浏览(34)
  • es 简单实现增加,查询,分词 热词

    看代码:  添加es中的表,index 表示表名 body 表示主体部分,然后执行,可以创建一个es 中的表格,相当于数据库中的数据表,现在还是空的表格,需要添加数据后在进行查询 添加: 先查询出添加数据库的数据,转为数组格式添加进es中 方便在随后的搜索中实现搜索 搜索:

    2024年02月15日
    浏览(44)
  • ES实现三表关联查询+条件过滤

            很多时候mysql的表之间是一对多的关系,比如库信息表(元数据信息),表信息表(元数据信息),字段信息表(元数据信息)。一个库可以包含多个表,一个表可以包含多个字段。他们的关系:库—(1:n)-表—(1:n)-字段。         ElasticsSearch(以下简称ES)处

    2024年02月05日
    浏览(45)
  • 迭代器模式 实现ES大量数据查询

    目录 项目需求  要求 普通策略 升级策略:使用迭代器模式 迭代器模式组成 代码实现 查询实体 返回实体 实现类 代码测试 mock的ES返回结果json数据 第一次返回结果 第二次返回结果 第三次返回结果 postMan请求, 控制台打印结果 数据从Mysql 迁移到 Es,  Es查询数据默认fetch Size最

    2024年01月20日
    浏览(37)
  • ES 实现数据库or查询效果

    ES :有两种常用查询           must   必须满足查询条件         should 非必须满足查询条件  如果想实现类似与mysql中的or 查询效果,必须使用should查询。但是shuold 会查询出不满足条件的数据 ,这必须加一个属性 \\\"minimum_should_match\\\": \\\"1\\\" 必须满足should条件中的一个查询

    2024年02月11日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包