go-redis 建搜索索引报 WEIGHT 字段类型无效,检查参数顺序
FTCreate同时设置Sortable和Weight时,Redis可能把WEIGHT当成下一字段名。保留权重、排序和索引选项,按服务端语法发送审核后的命令。
给搜索字段同时设置 Sortable: true 和 Weight: 2,FTCreate 却报:
Invalid field type for field `WEIGHT`
这里的 WEIGHT 本来是 TEXT 字段的选项。服务器把它当成了下一字段名,往往说明客户端拼出的参数顺序不符合当前搜索模块的语法。
保留真正发出的字段定义
go-redis v9.23.0 的 FTCreate 会先追加 SORTABLE、UNF、NOINDEX,随后才追加 PHONETIC、WEIGHT、SEPARATOR 等类型相关选项。Redis 8.2 的具体搜索场景中,下面两种顺序的含义不同:
t TEXT SORTABLE WEIGHT 2
t TEXT WEIGHT 2 SORTABLE
第一行可触发所述错误,第二行才把 WEIGHT 留在该字段的类型选项中。
TAG 字段的 SEPARATOR、CASESENSITIVE 等组合也需要看实际 token 顺序。不要只看到错误提到 WEIGHT,就认定项目意外新增了一个同名字段。
先核对已解析的 go-redis 版本、Redis 与搜索模块版本,以及最终命令参数。日志应只保留诊断需要的结构,不记录凭据或敏感索引内容。
用明确命令保留字段语义
在确实需要这些选项、且目前正式客户端仍产生错误顺序时,可以在原有客户端上发送审核过的显式命令。以下仅是新建测试索引的结构示例,rdb 和 ctx 沿用项目现有对象:
err := rdb.Do(ctx,
"FT.CREATE", "idx_articles_test", "ON", "HASH",
"PREFIX", 1, "article:test:",
"SCHEMA", "title", "TEXT", "WEIGHT", 2, "SORTABLE",
).Err()
索引名、前缀和字段名是示例,应换成获准测试范围。每个参数单独传给 Do,不要把一整行带引号的命令塞成一个参数。真实索引还有 FILTER、语言、其他字段或 JSON 路径时,必须完整保留其原有定义,不能只复制这一个字段片段。
不能为了过关直接删除 Sortable 或 Weight。前者改变排序能力,后者改变相关性评分。NOINDEX、UNF 也有独立语义,不应随意挪用或删掉。
如果索引已经存在,先读取并核对定义及初始化结果,不要自动执行 DROP 后重建。那会影响查询可用性与重建过程,属于另一项需要明确安排的变更。
验证搜索与排序都保留下来
在隔离数据上确认建索引成功,再检查字段定义、指定字段排序以及权重相关的搜索行为。只有 OK 不足以证明原来要求的评分和排序仍然存在。
当前核对的正式v9.23.0仍有该拼接顺序,不把开放修补当成正式修复。后续升级应检查对应发行代码和实际命令,使用v9.23.0还需满足其Go 1.26工具链要求;无需为本题关闭认证或TLS校验。


