在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