Redis全文搜索前缀匹配单词不生效问题排查
Redis Search前缀匹配问题解答
这和目标词出现的次数完全无关,核心原因是Redis Search的分词/词干处理逻辑导致的:
- Redis Search的前缀搜索(比如
gasp*)匹配的是经过索引分析器处理后的词条的前缀,而非原始文本的任意前缀。 - 你的字段里的
Gasprojekt是德语词汇,若你的索引使用了支持德语的词干分析器(哪怕是默认分析器的词干规则),会把这个词的词干提取成gas(去掉了后缀projekt)。 - 当你用
gas*搜索时,处理后的词条gas刚好匹配前缀,所以能命中文档;但gasp*是找以gasp开头的词条,而处理后的词条是gas,自然匹配失败。
验证方法
用FT.ANALYZE命令查看这个词经过索引分析器处理后的结果,就能明确最终生成的词条:
FT.ANALYZE idx:news "Gasprojekt"
解决办法
如果需要匹配原始词的前缀,有两种可行方案:
- 创建索引时关闭词干提取,给字段指定
NOSTEM参数:
这样FT.CREATE idx:news ON HASH PREFIX 1 news: SCHEMA inhalt TEXT NOSTEMGasprojekt会被完整处理为gasprojekt,gasp*就能正常匹配前缀。 - 使用子字符串通配符匹配(注意:这种方式性能比前缀搜索差,数据量大时谨慎使用):
FT.SEARCH idx:news "(@inhalt:*gasp*) (@id: [3693657 3693657])"
内容的提问来源于stack exchange,提问作者Nishal Taylor
相关产品推荐
相关产品推荐

