测试环境:ES 7.X
数据去重一般会遇到两类需求:一个是获得聚类结果,即标题+数量;另一类是获得去重后的标题。下面对比SQL分析在ES中如何做这两类操作。
聚类
聚类SQL实现语句
select <列1>,count(<列2>) from <表> group by <列1>;
Elasticsearch类似功能的使用aggs实现方式:
_search
{
"aggs": {
"<自定义名称>": {
"cardinality": {
"field": "<字段>"
}
}
}
}
结果在response[‘aggregations’][‘methods’][‘buckets’]中。
查询结果去重
获取去重后的结果SQL实现
select distinct <列> from <表>;
Elasticsearch类似功能使用折叠collapse实现方式(5.3+支持该功能,与query同级。):
_search
{
"query": {
"match_all":{}
},
"collapse": {
"field": "<字段>"
}
}
结果在response[“hits”][“hits”]中。
最后
- 使用aggs聚类之后取出字段名的方法虽然可以间接实现去重,但计算消耗会比直接使用collapse高。
- ES的聚合和折叠操作对keyword类型有效,使用其他的会出错。
- 资料显示还有top_hits方式去重,有些复杂但适应的版本更广,请自行查阅。