Elasticsearch-ES查询单字段去重
ES 语句
整体数据
GET wkl_test/_search
{"query": {"match_all": {}}
}
结果:
{"took" : 123,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 5,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "wkl_test","_type" : "_doc","_id" : "aK0tFpABTkLj5j4c34pE","_score" : 1.0,"_source" : {"name" : "zhangsan","aa" : 1}},{"_index" : "wkl_test","_type" : "_doc","_id" : "aa0uFpABTkLj5j4cFYrJ","_score" : 1.0,"_source" : {"name" : "lisi","aa" : 2}},{"_index" : "wkl_test","_type" : "_doc","_id" : "aq0uFpABTkLj5j4cKYqF","_score" : 1.0,"_source" : {"name" : "wangwu","aa" : 2}},{"_index" : "wkl_test","_type" : "_doc","_id" : "a60uFpABTkLj5j4c2IoF","_score" : 1.0,"_source" : {"name" : "maliu","aa" : 2}},{"_index" : "wkl_test","_type" : "_doc","_id" : "bK1IFpABTkLj5j4cqYop","_score" : 1.0,"_source" : {"name" : "gouqi","aa" : 3}}]}
}
1:collapse折叠功能- 查询去重后的数据列表(ES5.3之后支持)
- 推荐原因:性能高,占内存小
- 注意:使用此方式去重时,不会去除掉不存在去重字段的数据。
- 去重字段只能是数字long类型或keyword。
- Field Collapsing(字段折叠)不能与scroll、rescore以及search after 结合使用。
GET wkl_test/_search
{"query": {"match_all": {}},"collapse": {"field": "aa"}
}
结果:hits 中total虽然=5,但是只返回了去重后的 3 条数据
{"took" : 2,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 5,"relation" : "eq"},"max_score" : null,"hits" : [{"_index" : "wkl_test","_type" : "_doc","_id" : "aK0tFpABTkLj5j4c34pE","_score" : 1.0,"_source" : {"name" : "zhangsan","aa" : 1},"fields" : {"aa" : [1]}},{"_index" : "wkl_test","_type" : "_doc","_id" : "aa0uFpABTkLj5j4cFYrJ","_score" : 1.0,"_source" : {"name" : "lisi","aa" : 2},"fields" : {"aa" : [2]}},{"_index" : "wkl_test","_type" : "_doc","_id" : "bK1IFpABTkLj5j4cqYop","_score" : 1.0,"_source" : {"name" : "gouqi","aa" : 3},"fields" : {"aa" : [3]}}]}
}
2:cardinality - 查询去重后的数据总数
- 聚合+cardinality:即去重计算,类似sql中 count(distinct),先去重再求和
- 注意:使用此方式统计去重后的数量时,会去除掉不存在去重字段的数据。
GET wkl_test/_search
{"query": {"match_all": {}},"size": 0, "aggs": {"distinct_count": {"cardinality": {"field": "aa"}}}
}
结果:distinct_count = 3,说明去重后有3个,既aggregations聚合下,返回了按名字查询去重后的结果数,但是只有去重后的条数,没有具体的数据。
{"took" : 2,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 5,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"aggregations" : {"distinct_count" : {"value" : 3}}
}
3:整体语句
- 使用collapse 折叠查询后,虽然返回了去重后的数据,但是total 还是所有的数据量
- 使用 cardinality 聚合 ,虽然在aggs 聚合结果中返回了正确的数据量,但是hits中还是全部的数据
- 所以我们需要 两个综合使用,如下:
GET wkl_test/_search
{"query": {"match_all": {}},"collapse": {"field": "aa"}, "aggs": {"distinct_count": {"cardinality": {"field": "aa"}}}
}
结果:
{"took" : 3,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 5,"relation" : "eq"},"max_score" : null,"hits" : [{"_index" : "wkl_test","_type" : "_doc","_id" : "aK0tFpABTkLj5j4c34pE","_score" : 1.0,"_source" : {"name" : "zhangsan","aa" : 1},"fields" : {"aa" : [1]}},{"_index" : "wkl_test","_type" : "_doc","_id" : "aa0uFpABTkLj5j4cFYrJ","_score" : 1.0,"_source" : {"name" : "lisi","aa" : 2},"fields" : {"aa" : [2]}},{"_index" : "wkl_test","_type" : "_doc","_id" : "bK1IFpABTkLj5j4cqYop","_score" : 1.0,"_source" : {"name" : "gouqi","aa" : 3},"fields" : {"aa" : [3]}}]},"aggregations" : {"distinct_count" : {"value" : 3}}
}
注:我们使用cardinality聚合后的distinct_count 作为去重后的总数,用 collapse 折叠后的列表作为数据结果集
分页使用解释说明:
-
1.hits中total的总条数实际上是去重前的总条数,原数据条数,这里我们知道就行,分页中我们并不使用它。hits中数组的大小刚好等于courseAgg聚合的值,数组中的数据就是去重后的数据。
-
2.aggregations中的courseAgg条数,这个才是去重后的实际条数,也是分页用的总条数。
-
3.from 查询的偏移量,也就是从哪里开始查。
-
4.size 查询条数,一次查几条。
-
接下来,你就可以把它当做一个简单分页查询来用了,传入from和size就ok啦~
JAVA API使用
1:collapse 查询去重的结果集
// 使用collapse来指定去重的字段,例如"your_distinct_field"CollapseBuilder collapseBuilder = new CollapseBuilder("your_distinct_field");searchSourceBuilder.collapse(collapseBuilder);
2:cardinality - 查询去重后的数据总数
// 添加一个cardinality聚合来计算去重字段的唯一值数量CardinalityAggregationBuilder aggregation = AggregationBuilders.cardinality("distinct_count")//这里是聚合结果的字段名.field("your_distinct_field")//这里是需要聚合的字段.precisionThreshold(40000); // 根据需要调整精度阈值searchSourceBuilder.aggregation(aggregation);
3:整体使用
package com.wenge.system.utils;import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.metrics.CardinalityAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.ParsedCardinality;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.collapse.CollapseBuilder;import java.io.IOException;
import java.util.Map;/*** @author wangkanglu* @version 1.0* @description* @date 2024-06-17 16:48*/
public class TestES {public static void main(String[] args) throws IOException {//创建ES客户端RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost",9200,"http")));try {// 创建一个搜索请求并设置索引名SearchRequest searchRequest = new SearchRequest("your_index");// 构建搜索源构建器SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 设置查询条件,例如匹配所有文档,这里根据业务自己修改searchSourceBuilder.query(QueryBuilders.matchAllQuery());// 使用collapse来指定去重的字段,例如"your_distinct_field"CollapseBuilder collapseBuilder = new CollapseBuilder("your_distinct_field");searchSourceBuilder.collapse(collapseBuilder);// 添加一个cardinality聚合来计算去重字段的唯一值数量CardinalityAggregationBuilder aggregation = AggregationBuilders.cardinality("distinct_count")//这里是聚合结果的字段名.field("your_distinct_field")//这里是需要聚合的字段.precisionThreshold(40000); // 根据需要调整精度阈值searchSourceBuilder.aggregation(aggregation);// 设置搜索源searchRequest.source(searchSourceBuilder);// 执行搜索SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT);SearchHit[] hits = searchResponse.getHits().getHits();for (SearchHit hit : hits) {Map<String, Object> sourceAsMap = hit.getSourceAsMap();System.out.println("去重结果: " + sourceAsMap);}// 处理搜索结果,获取去重数量ParsedCardinality parsedCardinality = searchResponse.getAggregations().get("distinct_count");long distinctCount = parsedCardinality.getValue();System.out.println("去重结果数量:" + distinctCount);} finally {// 关闭clientesClient.close();}}
}
相关文章:
Elasticsearch-ES查询单字段去重
ES 语句 整体数据 GET wkl_test/_search {"query": {"match_all": {}} }结果: {"took" : 123,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0…...

【Apache Doris】周FAQ集锦:第 7 期
【Apache Doris】周FAQ集锦:第 7 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和…...

EE trade:炒伦敦金的注意事项及交易指南
在贵金属市场中,伦敦金因其高流动性和全球认可度,成为广大投资者的首选。然而,在炒伦敦金的过程中,投资者需要注意一些关键点。南华金业小编带您一起来看看。 国际黄金报价 一般国际黄金报价会提供三个价格: 买价(B…...

JAVA医院绩效考核系统源码 功能特点:大型医院绩效考核系统源码
JAVA医院绩效考核系统源码 功能特点:大型医院绩效考核系统源码 医院绩效管理系统主要用于对科室和岗位的工作量、工作质量、服务质量进行全面考核,并对科室绩效工资和岗位绩效工资进行核算的系统。医院绩效管理系统开发主要用到的管理工具有RBRVS、DRGS…...

Python神经影像数据的处理和分析库之nipy使用详解
概要 神经影像学(Neuroimaging)是神经科学中一个重要的分支,主要研究通过影像技术获取和分析大脑结构和功能的信息。nipy(Neuroimaging in Python)是一个强大的 Python 库,专门用于神经影像数据的处理和分析。nipy 提供了一系列工具和方法,帮助研究人员高效地处理神经影…...

非关系型数据库NoSQL数据层解决方案 之 Mongodb 简介 下载安装 springboot整合与读写操作
MongoDB 简介 MongoDB是一个开源的面向文档的NoSQL数据库,它采用了分布式文件存储的数据结构,是当前非常流行的数据库之一。 以下是MongoDB的主要特点和优势: 面向文档的存储: MongoDB是一个面向文档的数据库管理系统࿰…...
使用Redis优化Java应用的性能
使用Redis优化Java应用的性能 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨如何使用Redis优化Java应用的性能。Redis是一种开源的内存数据结构…...
基于Python的数据可视化大屏的设计与实现
基于Python的数据可视化大屏的设计与实现 Design and Implementation of Python-based Data Visualization Dashboard 完整下载链接:基于Python的数据可视化大屏的设计与实现 文章目录 基于Python的数据可视化大屏的设计与实现摘要第一章 导论1.1 研究背景1.2 研究目的1.3 研…...

什么是N卡和A卡?有什么区别?
名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、什么是N卡和A卡?有什么区别?…...

四边形不等式优化
四边形不等式优化 应用于类似以下dp转移方程。 f i min 1 ≤ j ≤ i ( w i , j , f i ) f_{i}\min_{1\le j\le i}(w_{i,j},f_{i}) fi1≤j≤imin(wi,j,fi) 假设 w i , j w_{i,j} wi,j 可以在 O ( 1 ) O(1) O(1) 的时间内进行计算。 在正常情况下,…...
这家民营银行起诉担保公司?暴露担保增信兜底隐患
来源 | 镭射财经(leishecaijing) 助贷领域中,各路资方依赖担保增信业务扩张数年,其风险积压也不容忽视。一旦助贷平台或担保公司兜不住底,资方就将陷入被动。 最近,一则民营银行起诉合作担保公司的消息引…...

vscode禅模式怎么退出
1、如何进入禅模式:查看--外观--禅模式 2、退出禅模式 按二次ESC,就可以退出。...

Java23种设计模式(四)
1、备忘录模式 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象,备忘录模式属于行为型模式。 备忘录模式允许在不破坏封装性的前提下,捕获和恢复对象的内部状态。 实现方式 创建备忘录…...

HTML静态网页成品作业(HTML+CSS)——故宫介绍网页(4个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有4个页面。 二、作品演示 三、代…...
Zookeeper:客户端命令行操作
文章目录 一、help二、ls path三、create四、get path五、set六、stat七、delete八、deleteall 一、help 显示所有操作命令。 二、ls path 使用ls命令来查看当前znode的子节点[可监听] w:监听子节点变化。s:附加次级信息。 三、create 普通创建&am…...
区块链技术介绍和用法
区块链技术是一种分布式账本技术,可以记录和存储一系列交易信息,并通过密码学算法保证信息的安全性和不可篡改性。区块链技术的核心概念是“区块”和“链”。 每个区块包含了一部分交易信息,以及一个指向上一个区块的哈希值。当新的交易发生…...

Upload-Labs-Linux1 使用 一句话木马
解题步骤: 1.新建一个php文件,编写内容: <?php eval($_REQUEST[123]) ?> 2.将编写好的php文件上传,但是发现被阻止,网站只能上传图片文件。 3.解决方法: 将php文件改为图片文件(例…...

从 Hadoop 迁移,无需淘汰和替换
我们仍然惊讶于有如此多的客户来找我们,希望从HDFS迁移到现代对象存储,如MinIO。我们现在以为每个人都已经完成了过渡,但每周,我们都会与一个决定进行过渡的主要、高技术性组织交谈。 很多时候,在这些讨论中ÿ…...

深度学习:从理论到应用的全面解析
引言 深度学习作为人工智能(AI)的核心技术之一,在过去的十年中取得了显著的进展,并在许多领域中展示了其强大的应用潜力。本文将从理论基础出发,探讨深度学习的最新进展及其在各领域的应用,旨在为读者提供全…...

【02】区块链技术应用
区块链在金融、能源、医疗、贸易、支付结算、证券等众多领域有着广泛的应用,但是金融依旧是区块链最大且最为重要的应用领域。 1. 区块链技术在金融领域的应用 1.2 概况 自2019年以来,国家互联网信息办公室已发布八批境内区块链信息服务案例清单&#…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...