身安不如心安,屋宽不如心宽 。

请教大佬,搜索结果按某个字段进行分类,每个分类第一条结果优先展示,同一分类其他结果进行减分降权(不是过滤掉),应该怎么做呢

Elasticsearch | 作者 kyzu0021 | 发布于2023年03月23日 | 阅读数:4220

搜索结果按某个字段进行分类,每个分类第一条结果优先展示,同一分类其他结果进行减分降权(不是过滤掉)。比如搜索运动鞋,为了公平原则,保证不同店铺都能起码展示一条结果,同一店铺的第二及之后的结果进行减分降权,排名递减。请问ES应该怎么做,还是只能在业务端对搜索结果进行二次处理呢
已邀请:

charlesfang

赞同来自: wfx kyzu0021

如果不需要考虑同一类结果的排序问题,你可以通过ScriptScore处理,大致就是script中记录遇到的分类,后续遇到时,对_score进行减分处理,比如乘以0.1,处理之后不在一个量级。这里有一个ScriptScore插件代码示例。
https://www.elastic.co/guide/e ... .html
 
如果需要考虑同一类结果的排序问题,你这个属于二次排序,只能是二次处理了。es内部也有一个rescore功能,可以考虑一下,列表已经是根据_score降序排序的结果,还是得用上边的ScriptScore在rescore中处理,处理方式一致。https://www.elastic.co/guide/e ... score

YuLiGod - 小于小朋友

赞同来自: kyzu0021

通过搜索关键词并聚合分类得到需优先展示的结果的id,然后使用ScriptScore,将对应id的数据评分抬高;
这样需要两次请求,并且聚合多节点操作,可能比较慢;
 
从业务的角度来说,最好支持店铺可以对其运动鞋分类中的1个商品进行标记,标记后设置标记字段为1,查询时可以根据该字段进行排序并加权即可;这样店铺也可以自己选择对应的"星标商品"进行推荐;

Marquezzzz

赞同来自:

可以考虑给同一分类的第一名打个标签 hot = 100,二三四名分别是 9, 8, 7 依次递减。然后在搜索的时候进行重新打分 _score * doc['hot'],这样可以避免业务端对搜索结果进行二次处理。

要回复问题请先登录注册