最近在业务中需要使用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类型有效

最新文章

  1. 每天一个设计模式-4 单例模式(Singleton)
  2. SQL注入的原理以及危害
  3. Linux下安装mongodb详细过程
  4. 微信网站设置右上角发送、分享的内容——.net版本
  5. PDO数据库抽象层
  6. asp.net小结
  7. Jquery AJax Post 返回值问题
  8. HDU 5833 Zhu and 772002 (高斯消元)
  9. App是什么,可以分为几类?及其相关解释。
  10. 10 条提升 Android 性能的建议
  11. jquery之onchange事件2
  12. Eddy's digital Roots(九余数定理)
  13. hdu1698 Just a Hook 线段树:成段替换,总区间求和
  14. Python系列 - optparse
  15. freemarker的使用
  16. java 反射得到属性与属性值
  17. Window 下载Android系统源代码
  18. Nginx 教程(3):SSL 设置
  19. 自动化测试-1.selenium简介
  20. JS取出两个数组中不重复的值

热门文章

  1. Chomp类游戏——必胜策略分析
  2. [教程]Ubuntu16.04安装TeX Live
  3. MongoDB 企业版4.2.2安装
  4. ent 基本使用十二 字段
  5. SQL进阶-数据类型转换
  6. TCP/IP协议族基本知识
  7. [sdoi 2017]树点涂色
  8. 第10组 Alpha冲刺(1/4)
  9. Hadoop FairScheduler
  10. Swagger-BootStrap-UI生成的接口文档如何加Basic校验