Algolia InstantSearch按state(live/published/draft)配置默认排序
Algolia 实现state字段自定义优先级排序的配置方法
要实现live状态 > published状态 > draft状态的默认排序,不要在前端拿到结果后自行排序(会破坏分页、命中数统计等原生逻辑,大数据量下性能很差),推荐两种可落地的方案:
方案1:索引侧预配置(性能最优,适合生产环境)
Algolia原生不支持直接按字符串枚举值做自定义顺序排序,需要先给记录增加数值型权重字段,再配置排序规则:
给所有索引记录新增数值字段
state_rank,按state值对应赋值:state: live→state_rank: 3(权重最高)state: published→state_rank: 2state: draft→state_rank: 1(权重最低)
处理后的测试数据结构如下:
[ { "name": "Post1", "state": "draft", "state_rank": 1 }, { "name": "Post2", "state": "published", "state_rank": 2 }, { "name": "Post3", "state": "live", "state_rank": 3 } ]进入Algolia后台对应索引的Ranking and Sorting配置页,在排名公式中新增一条自定义排序规则:选择
state_rank字段,排序方式设为降序(desc)。把这条规则放在文本相关性规则之后、其他业务排序规则之前,保证不影响正常搜索匹配精度的前提下,同相关性的结果自动按state优先级排序。如果需要保留原主索引的其他排序逻辑,可以单独创建一个排序专用的副本索引,把
state_rank降序设为副本索引的默认排序规则,InstantSearch初始化时默认对接这个副本索引即可。
方案2:前端请求参数配置(无需改存量数据,适合快速上线)
如果不想修改已有索引的字段结构,可以直接在InstantSearch的configure组件里传optionalFilters参数,给不同state值配置不同权重,权重越高排名越靠前,配置示例:
search.addWidgets([ instantsearch.widgets.configure({ hitsPerPage: 20, // 其他通用配置... optionalFilters: [ 'state:live<3>', 'state:published<2>', 'state:draft<1>' ] }) ])
这个方案在中小数据量场景下效果和索引侧配置一致,配置完直接生效,不需要重建索引。
两种方案配置完成后,默认返回的结果顺序就和预期完全一致:
[ { "name": "Post3", "state": "live" }, { "name": "Post2", "state": "published" }, { "name": "Post1", "state": "draft" } ]
内容的提问来源于stack exchange,提问作者Bhanwarlal Chaudhary
相关产品推荐
相关产品推荐

