最近在业务中需要使用ES来进行数据查询,在某些场景下需要对数据进行去重,以及去重后的统计。为了方便大家理解,特意从SQL角度,方便大家能够理解ES查询语句。

1 - distinct

SELECT DISTINCT(user_id) FROM table WHERE user_id_type = 3;

{"query": {"term": {"user_id_type": 3}},"collapse": {"field": "user_id"}
}

  

{..."hits": {"hits": [{"_index": "es_qd_mkt_visitor_packet_dev_v1_20180621","_type": "ad_crowd","_source": {"user_id": "wx2af8414b502d4ca2_oHtrD0Vxv-_8c678figJNHmtaVQQ","user_id_type": 3},"fields": {"user_id": ["wx2af8414b502d4ca2_oHtrD0Vxv-_8c678figJNHmtaVQQ"]}}]}
}

  

总结:使用collapse字段后,查询结果中[hits]中会出现[fields]字段,其中包含了去重后的user_id

2 - count + distinct

SELECT COUNT(DISTINCT(user_id)) FROM table WHERE user_id_type = 3;

  

{"query": {"term": {"user_id_type": 3}},"aggs": {"count": {"cardinality": {"field": "user_id"}}}
}

 

{..."hits": {...},"aggregations": {"count": {"value": 121}}
}

  

总结:aggscardinality的字段代表需要distinct的字段

3 - count + group by

SELECT COUNT(user_id) FROM table GROUP BY user_id_type;

  

{"aggs": {"user_type": {"terms": {"field": "user_id_type"}}}
}

  

{..."hits": {...},"aggregations": {"user_type": {..."buckets": [{"key": 4,"doc_count": 1220},{"key": 3,"doc_count": 488}]}}
}

  

总结:aggsterms的字段代表需要gruop by的字段

4 - count + distinct + group by

SELECT COUNT(DISTINCT(user_id)) FROM table GROUP BY user_id_type;

  

{"aggs": {"user_type": {"terms": {"field": "user_id_type"},"aggs": {"count": {"cardinality": {"field": "user_id"}}}}}
}
{..."hits": {...},"aggregations": {"user_type": {..."buckets": [{"key": 4,"doc_count": 1220, //去重前数据1220条"count": {"value": 276 //去重后数据276条}},{"key": 3,"doc_count": 488, //去重前数据488条"count": {"value": 121 //去重后数据121条}}]}}
}

  

4 - count + distinct + group by

SELECT COUNT(DISTINCT(user_id)) FROM table WHERE user_id_type = 2 GROUP BY user_id;

  

总结:对于既有group by又有distinct的查询要求,需要在aggs中嵌套子aggs

5 - 注意事项

collapse关键字

  1. 折叠功能ES5.3版本之后才发布的。
  2. 聚合&折叠只能针对keyword类型有效

转载于:https://www.cnblogs.com/taozi32/p/10411524.html

ElasticSearch中distinct,count和group by的实现相关推荐

  1. MySQL中distinct和group by性能比较

    MySQL中distinct和group by性能比较[转] 之前看了网上的一些测试,感觉不是很准确,今天亲自测试了一番.得出了结论(仅在个人计算机上测试,可能不全面,仅供参考) 测试过程: 准备一张 ...

  2. distinct mysql性能_MySQL中distinct与group by之间的性能进行比较

    最近在网上看到了一些测试,感觉不是很准确,今天亲自测试了一番.得出了结论,测试过程在个人计算机上,可能不够全面,仅供参考. 测试过程: 准备一张测试表 CREATE TABLE `test_test` ...

  3. distinct mysql性能_MySQL中distinct和group by性能比较

    MySQL中distinct和group by性能比较[转] 之前看了网上的一些测试,感觉不是很准确,今天亲自测试了一番.得出了结论(仅在个人计算机上测试,可能不全面,仅供参考) 测试过程: 准备一张 ...

  4. mysql的group语句_MySQL中distinct与group by语句的一些比较及用法讲解

    这篇文章主要介绍了MySQL中distinct与group by的一些比较及用法讲解,二者在查询操作中的用法有很多相似之处,需要的朋友可以参考下 在数据表中记录了用户验证时使用的书目,现在想取出所有书 ...

  5. sql 中distinct和group by

    sql中distinct和group by都可以用于去重复,distinct是将重复的行从结果中出去,group by是按指定的列分组.区别是group by 中可以包含聚合函数. 如下所示的表结构, ...

  6. MySQL中district_MySQL中distinct语句的基本原理及其与group by的比较

    DISTINCT 实际上和 GROUP BY 操作的实现非常相似,只不过是在 GROUP BY 之后的每组中只取出一条记录而已.所以,DISTINCT 的实现和 GROUP BY 的实现也基本差不多, ...

  7. mysql count 返回0_如何在MySQL中使用COUNT時返回0而不是null

    我正在使用此查詢返回存儲在$ sTable中的歌曲列表以及存儲在$ sTable2中的總項目的COUNT.如何在MySQL中使用COUNT時返回0而不是null /* * SQL queries * ...

  8. SQL优化(二) 快速计算Distinct Count

    2019独角兽企业重金招聘Python工程师标准>>> 原创文章,首发自个人站点 ,转载请务必注明出处 http://www.jasongj.com/2015/03/15/count ...

  9. 【Elasticsearch】Elasticsearch中数据是如何存储的

    1.概述 转载:Elasticsearch中数据是如何存储的 前言 很多使用Elasticsearch的同学会关心数据存储在ES中的存储容量,会有这样的疑问:xxTB的数据入到ES会使用多少存储空间. ...

最新文章

  1. dae模型如何合并_FBX、DAE模型的格式、导入与骨骼动画
  2. EUV光刻机全球出货量达57台
  3. MATLAB表白利器
  4. malloc 和 calloc的区别?
  5. ubuntu12.04LTS安装已经共享的打印机
  6. java cursor 删除_使用CursorRecyclerAdatper在RecyclerView中删除和撤消
  7. oracle_j000,Process J000 died, kkjcre1p: unable to spawn jobq slave process引起的宕机
  8. MySQL 在 Mac 环境下的安装
  9. 数据洞察 | Python解读地摊——你想好摆摊去卖什么了吗?
  10. HTML5,不只是看上去很美(第四弹:可交互地铁线路图)
  11. steam安装包_Steam已经绑定了令牌,为什么还会频繁被盗?
  12. 理解:iOS开发中锁的实现原理
  13. Xilinx Zynq-7000 PL端Kintex-7架构可编程逻辑资源,PS端主频可高达1GHz晶振、电源接口和拨码开关
  14. 嵌入式系统软件开发环境
  15. oracle导入dmp秒退,Oracle导入dmp遇到问题解决
  16. 全面质量管理 - TQM Diagram
  17. Class - 7 用户输入和while循环
  18. 如何下载python3.7.2_【亲测能用】Python3.7.2绿色版【Python3.7.2破解版】中文版软件官方下载-羽兔网...
  19. Proteus隔空连线教学
  20. 0711 - 在 iPic 周岁时,说说这款让我骄傲的产品

热门文章

  1. 修改sga后oracle打不开的解决方法
  2. Appium 移动端自动化 - Android SDK连接安卓手机,adb连接一加8手机USB调试实例演示,连接一加8手机不显示USB调试选项问题排查
  3. 从源码理解ReentrantLock
  4. 电磁场与电磁波第四章 时变电磁场
  5. windows的键盘输入重定向
  6. Fibonacci Again
  7. 13.4 常见的时期类和Math类
  8. 第八讲 一阶常系数线性ODE(续)
  9. Python 操作redis
  10. Python-5-字符串方法