Redis OM Spring存在数据但FT.SEARCH查询无结果的解决办法
核心原因
你遇到的问题是authorizationCodeValue同时标记了@Indexed和@Searchable,授权码这类含特殊字符(下划线、连字符)的精确值,在全文索引(@Searchable对应TEXT类型索引)的默认分词逻辑下会被拆分,导致无法匹配完整的授权码字符串。
解决方案
方案1:移除@Searchable,仅保留@Indexed(推荐,适配精确匹配场景)
授权码属于精确匹配场景,无需全文搜索能力,直接移除@Searchable注解,让Redis-OM创建精确匹配的索引:
@Data @Document public class RedisOAuth2Authorization implements Serializable { @Indexed @NonNull @Id private String id; @Indexed @Searchable private String registeredClientId; @Indexed // 移除@Searchable private String authorizationCodeValue; }
注意:需先删除旧索引(若已存在),否则新索引不会生效:
FT.DROPINDEX com.my.RedisOAuth2AuthorizationIdx
重启应用后,Redis-OM会重新创建索引,此时调用findByAuthorizationCodeValue会生成精确匹配查询,即可正确返回结果。
方案2:保留@Searchable,使用精确匹配查询语法
如果必须保留@Searchable(比如其他场景需要该字段的全文搜索能力),可通过@Query注解指定RedisSearch的精确匹配语法:
@Repository public interface RedisOAuth2AuthorizationRepository extends RedisDocumentRepository<RedisOAuth2Authorization, String> { @Query("@authorizationCodeValue:{?0}") List<RedisOAuth2Authorization> findByAuthorizationCodeValue(String authorizationCodeValue); }
这里的{?0}是参数占位符,@field:{value}是RedisSearch针对TEXT字段的精确匹配语法,会完整匹配传入的授权码字符串,忽略分词逻辑。
方案3:验证存储值与查询值的一致性
先确认Redis中存储的authorizationCodeValue和查询参数完全一致:
- 查找所有相关键:
KEYS com.my.RedisOAuth2Authorization:*
- 查看指定键的字段值:
HGET com.my.RedisOAuth2Authorization:你的ID值 authorizationCodeValue
对比输出值和查询参数,检查是否存在大小写差异、额外空格或字符转义问题。
额外验证
可用FT.INFO命令查看索引字段定义,确认索引类型符合预期:
FT.INFO com.my.RedisOAuth2AuthorizationIdx
查看fields部分,若authorizationCodeValue是TEXT类型(对应@Searchable)则用方案2;若为TAG或STRING类型(对应@Indexed)则用方案1即可。
内容的提问来源于stack exchange,提问作者Suvin Nimnaka Sukka

