关系型数据库中,比如MySQL,可以通过distinct进行去重,或者根据group by分组
Elasticsearch类似功能的实现方式
1 ) es查询结果进行去重计数
es的去重计数工卡可以通过es的聚合功能+Cardinality聚合函数来实现
2 ) es查询结果去重后显示
去重显示有两种方式:
(1) 使用字段聚合+top_hits聚合方式
(2)使用collapse折叠功能
第一种top_hits
,
"aggs": {
"group_acc_type": {
"terms": {
"field": "acc_type",
"size": 1000
},
"aggs": {
"uuid_top": {
"top_hits": {
"sort": [
{
"uuid": {
"order": "desc"
}
}
],
"size": 1
}
}
}
}
},
结果在aggregations下面
使用折叠
用法简单,效率更好
GET tms-pro-trade-record-beta-6/_search
{
"query": {
"bool": {
"filter": {
"bool": {
"must": [
{
"bool": {
"must": [
{
"match": {
"monthly_number.like&lowercase": "YJZD202110251446126408"
}
},
{
"term": {
"group_id": "88888"
}
}
]
}
}
]
}
}
}
},
"sort": [
{
"create_time": "desc"
},
{
"trade_id": "desc"
}
],
"collapse": {
"field": "conn_info.vir_order_num"
}
}
但是collapse方法只支持对某一个字段去重,也就是只要详情id相同,不管其它字段是否相同,都只显示一条,但这显示不是我想要的,我需要的是必须详情id,页面名,api名这三个字段都相同时,才去掉重复。。那怎么办呢?很简单,在es里再定义一个字段,把这三个字段的值拼起来保存,然后再用collapse对这个字段来进行去重就可以了。
但是要注意一点,collapse里的字段必须是keyword。不知道怎么设定字段为keyword的请自行百度。