彆著急,坐和放寬
使用社群帳號登入
推荐系统的核心在于找到最适合用户需求的候选产品。常见的流程包括以下几个步骤:
问题在于,向量匹配的 score 是由外部系统计算的,不能直接传入 ES,同时有希望结合其他的字段做进一步排序。我们希望根据 score 对产品进行分桶排序,并在每个分桶内按销量降序排列。
为了解决上述问题,我们引入离散数学的分桶思想:
通过这种方式,我们既保留了向量匹配的相似度信息,又结合了产品销量,实现了更符合业务需求的排序逻辑。
以下是核心排序代码:
public static List<Item> sortItems(List<Item> items, Map<String, Float> idScoreMap) {
if (items == null || idScoreMap == null) {
return new ArrayList<>(); // 处理空输入
}
return items.stream()
.sorted(Comparator
.comparing((Item item) -> {
// 获取分数值;如果不存在则使用默认值 0f
float score = idScoreMap.getOrDefault(item.id, 0f);
// 将分数映射到 0.05 的倍数范围内
return (float) (Math.floor(score / 0.05f) * 0.05f);
}, Comparator.reverseOrder()) // 按分桶值降序排列
.thenComparingInt(item -> -item.soldNum) // 在每个分桶内按销量降序排列
)
.collect(Collectors.toList()); // 返回排序后的列表
}
离散化处理 我们通过以下公式将分数划分为离散范围:
float rangeKey = (float) (Math.floor(score / 0.05f) * 0.05f);
该公式的作用是将任意分数映射到最近的 0.05 倍数范围。例如: • 0.333 → 0.30 • 0.367 → 0.35