在Elasticsearch6.X中如何实现去重


1、前言

Elasticsearch有没有类似mysql的distinct的去重功能呢?

1)如何去重计数? 
类似mysql: select distinct(count(1)) from my_table; 
2)如何获取去重结果。 
类似mysql:SELECT DISTINCT name,age FROM users;

2、需求

1)对ES的检索结果进行去重统计计数。 
2)对ES的检索结果去重后显示

3、分析

1)统计计数需要借助ES聚合功能结合cardinality实现。 
2)去重显示结果有两种方式: 
方式一:使用字段聚合+top_hots聚合方式。 
方式二:使用collapse折叠功能。

4、DSL源码

1)统计去重数目。

GET books/_search { "size":0, "aggs" : { "books_count" : { "cardinality" : { "field" : "title.keyword" } } } }

2)返回去重内容

方式一:top_hits聚合

GET books/_search { "query": { "match_all": {} }, "aggs": { "type": { "terms": { "field": "title.keyword", "size": 10 }, "aggs": { "title_top": { "top_hits": { "_source": { "includes": ["title"] }, "sort": [ { "title.keyword": { "order": "desc" } } ], "size":1 } } } } }, "size": 0 }

方式二:折叠

GET books/_search { "query": { "match_all":{} }, "collapse": { "field": "title.keyword" } }

方式二较方式一: 
1)简化; 
2)性能比aggs的实现要好很多。 
更多DSL详见:http://t.cn/RmafXMJ

5、注意事项&小结

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM