Redis Search含@字符的TEXT字段ft.search查询异常问题
Redis Search 查询含@和UUID的TEXT字段问题解决
问题原因分析
- 分词器拆分问题:默认TEXT字段使用的分词器(如English分词器)会将
@、-这类非字母数字字符视为分隔符,把原字符串拆分为多个独立token(比如test、gmail、com5d13e891、162a等),导致完整的邮箱+UUID字符串、UUID后缀无法匹配到对应的token。 - 后缀查询限制:默认TEXT字段索引仅支持前缀通配符(
test*),不支持后缀通配符(*UUID),需手动开启后缀支持。 - @字符的特殊处理:默认分词器会过滤或拆分
@,导致查询时的@无法匹配索引中的内容,且查询语法中@是字段前缀标识,需确保值中的@被当作普通字符处理。
解决方案
1. 调整分词器,保留完整字符
创建索引时使用WHITESPACE分词器(仅以空格作为分隔符),让@、-等字符保留在token中,确保整个字符串作为一个完整token被索引:
ft.create json:search on json prefix 1 "json:" schema $.text as text text tokenizer whitespace
如果需要更灵活的分词规则,可自定义正则分词器,比如仅以空格拆分:
# 先配置自定义分词器 ft.config set custom_tokenizers '{"my_tokenizer": {"type": "regex", "pattern": "\\s+"}}' # 创建索引时使用该分词器 ft.create json:search on json prefix 1 "json:" schema $.text as text text tokenizer my_tokenizer
2. 开启后缀通配符支持
若需要使用*UUID这类后缀查询,创建字段时需添加WITHSUFFIX参数:
ft.create json:search on json prefix 1 "json:" schema $.text as text text tokenizer whitespace withsuffix
3. 正确查询含@的字符串
使用调整后的分词器后,直接用引号包裹查询值(避免shell转义问题),即可匹配含@的完整字符串:
ft.search json:search '@text: "test@gmail.com5d13e891-162a-456b-abf2-fd9b864df96d"'
若在终端执行时遇到转义问题,可将查询值用单引号嵌套包裹:
ft.search json:search '@text: '\''test@gmail.com5d13e891-162a-456b-abf2-fd9b864df96d'\'''
关于UUID作为TEXT类型的问题
UUID本身作为TEXT类型存储没有问题,核心问题是默认分词器会拆分UUID中的-字符,导致无法通过完整UUID或UUID后缀匹配。只要调整分词器让-保留在token中,即可正常查询UUID相关内容。
内容的提问来源于stack exchange,提问作者adamzrk
相关产品推荐
相关产品推荐

