You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redis Search含@字符的TEXT字段ft.search查询异常问题

Redis Search 查询含@和UUID的TEXT字段问题解决

问题原因分析

  1. 分词器拆分问题:默认TEXT字段使用的分词器(如English分词器)会将@、-这类非字母数字字符视为分隔符,把原字符串拆分为多个独立token(比如test、gmail、com5d13e891、162a等),导致完整的邮箱+UUID字符串、UUID后缀无法匹配到对应的token。
  2. 后缀查询限制:默认TEXT字段索引仅支持前缀通配符(test*),不支持后缀通配符(*UUID),需手动开启后缀支持。
  3. @字符的特殊处理:默认分词器会过滤或拆分@,导致查询时的@无法匹配索引中的内容,且查询语法中@是字段前缀标识,需确保值中的@被当作普通字符处理。

解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 13:45:08