问询AWS Personalize GetRecommendations API分页及无重复拉取方案
基于AWS Personalize实现无重复无限滚动分页的可行方案
核心实现逻辑
- 优先使用Personalize原生过滤器 + 游标分页的组合方案,完全不需要额外做结果去重,性能损耗最低:
- 先在AWS Personalize控制台创建自定义过滤器,过滤规则为
EXCLUDE itemId IN $EXCLUDED_ITEM_IDS - 首次请求时调用
GetRecommendations接口,numResults按单页展示数量设置(最高支持100),此时filterValues参数不需要传$EXCLUDED_ITEM_IDS,拿到结果后将本次返回的所有item ID存入服务端对应用户的缓存(可用Redis、会话存储等,过期时间可设为24小时或者用户会话有效期),将结果返回前端。 - 前端滚动到页面底部触发下一页请求时,服务端从缓存中取出该用户所有已展示的item ID列表,作为
$EXCLUDED_ITEM_IDS参数传入filterValues调用GetRecommendations,此时接口返回的所有结果都是未展示过的内容。 - 每次请求完成后更新缓存中的已展示item ID列表,直到推荐结果返回为空时终止分页即可。
- 先在AWS Personalize控制台创建自定义过滤器,过滤规则为
- 如果你的推荐量级较大,已展示ID列表过长超过过滤器参数长度限制(Personalize单过滤器参数最多支持传入100个item ID),可以配合批量拉取+本地分页的方案补充:
- 每次前端触发分页时,如果已展示ID超过100个,先一次性拉取最多100条未过滤的推荐结果,在服务端和已展示ID列表做比对,过滤掉重复项后截取对应单页数量的结果返回给前端,剩下的非重复结果可以暂存到服务端缓存,下一次分页直接从缓存取,不需要重复调用Personalize接口。
- 当暂存的待展示结果不足单页数量时,再重复调用Personalize接口拉取新的批次即可。
注意事项
- 已展示item ID的缓存要和用户ID绑定,避免不同用户的展示记录混淆,同时需要设置合理的过期时间,避免缓存资源占用过高。
- 如果你的推荐场景允许极低概率的重复,也可以直接在前端做已展示ID的去重,不需要服务端缓存,实现成本更低。
内容的提问来源于stack exchange,提问作者Nando Sang Putra
相关产品推荐
相关产品推荐

