ZPY博客

ElasticSearch7.x搜索结果去重

现在我的业务场景是这样的,我用es记录用户的浏览记录,设想是用户每次访问详情页时往es里写记录,分别记录详情id,页面名,api名和访问时间。这里存在一个问题就是可能存在重复的数据,比如一个用户在不同时间多次观看了某一个视频,这样es里就存在几条除了时间不同,其它字段都相同的几条数据。最后返回给前端的结果是需要去掉重复的数据的,也就是同一个用户只返回一条最近观看此视频的记录。

我们都知道,sql的话,用distinct关键字即可解决,那么es里有没有类似的功能呢?答案是有。那就是collapse方法。使用方法很简单,如果你想根据详情id去重,那么就设定

"collapse": {
"field": "detailId.keyword"
}

即可。

但是collapse方法只支持对某一个字段去重,也就是只要详情id相同,不管其它字段是否相同,都只显示一条,但这显示不是我想要的,我需要的是必须详情id,页面名,api名这三个字段都相同时,才去掉重复。。那怎么办呢?很简单,在es里再定义一个字段,把这三个字段的值拼起来保存,然后再用collapse对这个字段来进行去重就可以了。

※但是要注意一点,collapse里的字段必须是keyword。不知道怎么设定字段为keyword的请自行百度。