如何在Redis Search中实现MySQL的ORDER BY FIELD自定义排序功能
Redis Search 实现 MySQL ORDER BY FIELD 等效自定义排序的方案
Redis Search 没有原生提供和 MySQL FIELD() 完全对齐的内置排序函数,你可以通过自定义得分映射的方式实现完全一致的排序效果,具体操作如下:
方案1:查询时动态计算排序权重(适合短序列、排序规则频繁变化的场景)
使用 FT.SEARCH 的 APPLY 参数,给不同id的文档分配对应优先级的权重值,最后按权重倒序排列即可,对应你需求的示例命令如下:
FT.SEARCH product_idx "*" APPLY "(@id == 3) ? 4 : (@id == 2) ? 3 : (@id == 1) ? 2 : (@id == 4) ? 1 : 0" AS custom_sort SORTBY custom_sort DESC
参数说明:
product_idx替换为你实际的product数据对应的索引名- 三元表达式按你的排序顺序赋值:排在越前的id,分配的权重值越高
- 若你的id字段为字符串类型,把表达式中的数值改为字符串包裹即可,比如
@id == "3" - 有其他过滤条件的话,把命令中的
"*"替换为你的过滤查询语句即可,不影响自定义排序逻辑
方案2:预存排序优先级字段(适合长序列、排序规则相对固定的场景)
如果你的自定义排序id列表很长,或者查询QPS很高,可以在文档中新增一个专门的sort_priority数值字段:
- 每次业务需要调整排序顺序时,批量更新对应id文档的
sort_priority值,顺序越靠前的id设置越高的数值 - 查询时直接执行
FT.SEARCH product_idx "*" SORTBY sort_priority DESC即可,该方案查询性能远高于动态计算的方案
内容的提问来源于stack exchange,提问作者Saman Shahroudi
相关产品推荐
相关产品推荐

