Redis Tag 字段详解与最佳实践
一、引言
在 RediSearch 中,Tag 字段(标签字段)是用来存储离散、可枚举值的高效索引类型。与全文(TEXT)字段不同,Tag 字段将整段文本视作由分隔符分隔的“标签列表”,并针对每个标签做最小化索引,从而在内存占用和查询速度上都更具优势。本文将深入介绍 Tag 字段的工作原理、创建方式、查询语法,以及常见场景下的最佳实践与注意事项。
二、Tag 字段核心特点
-
简单分词
默认使用逗号(,
)或自定义分隔符,将整个字段拆分成若干独立标签,不做复杂的词干化或停用词处理。 -
高压缩、低开销
索引中仅存储文档 ID 的增量编码,不保存频率或偏移信息,通常每项索引仅占 1–2 字节。 -
只能通过专用语法查询
普通的无字段全文搜索(FT.SEARCH foo)不会命中 Tag 字段,必须使用@field:{tag}
语法。 -
支持多达 1024 个字段
每个索引最多可定义 1024 个 Tag 字段,满足复杂场景需求。
三、创建 Tag 字段
FT.CREATE idx:products ON HASH PREFIX 1 product:SCHEMAname TEXTprice NUMERICtags TAG [SEPARATOR ";" ] [CASESENSITIVE]
TAG
:指定字段类型为标签。SEPARATOR ";"
:可选,定义不同标签之间的分隔符,默认为逗号(,
)。CASESENSITIVE
:可选,开启后标签大小写敏感,否则内部会统一小写处理。
对于 JSON 索引,同样需要显式指定分隔符:
FT.CREATE idx:users ON JSON PREFIX 1 user:SCHEMA$.roles AS roles TAG SEPARATOR "|"
四、查询 Tag 字段
4.1 基本语法
FT.SEARCH idx "@tags:{admin}"
-
花括号
{}
中列出要匹配的标签,可用管道符|
表示「或」关系:FT.SEARCH idx "@tags:{admin|editor|viewer}"
4.2 多标签查询:并集与交集
-
并集(至少包含其一):在同一个
{}
内用|
分隔:FT.SEARCH idx "@tags:{news|tech|sports}"
-
交集(同时包含所有):将同一字段的多次过滤串联:
FT.SEARCH idx "@tags:{news} @tags:{tech} @tags:{sports}"
4.3 前缀匹配
Tag 字段支持星号 *
作为通配:
FT.SEARCH idx "@tags:{adm*}" # 匹配所有以 adm 开头的标签
FT.SEARCH idx "@tags:{hello\ w*}" # 支持转义空格后的通配
注意:在终端或编程环境中,反斜杠需双重转义(例如
\\
)。
五、标签中包含标点与空格
标签本身可以包含除分隔符之外的任意可打印字符,包括空格和标点。但在查询时,涉及下列情况需要转义:
-
单引号
'
、反斜杠\
等特殊字符
使用反斜杠\
转义:FT.SEARCH idx "@tags:{Andrew\\'s Top 5}"
-
空格
- 在 RediSearch ≥2.4 或 DIALECT ≥2 时,标签内空格无需额外转义。
- 在老版本或 DIALECT=1 时,需用反斜杠转义空格。
六、实战示例
-
索引创建
FT.CREATE travel ON HASH PREFIX 1 traveler:SCHEMAname TEXTcities TAG SEPARATOR ","
-
数据插入
HSET traveler:1 name "Alice" cities "Paris,New York,Tokyo" HSET traveler:2 name "Bob" cities "London,New York"
-
查询示例
-
访问过任意一座城市
FT.SEARCH travel "@cities:{New York|Paris}"
-
同时访问过所有三座城市
FT.SEARCH travel "@cities:{Paris} @cities:{New York} @cities:{Tokyo}"
-
七、最佳实践与注意事项
-
选择合适的分隔符
根据标签数据特点,避免分隔符与标签内容冲突,例如使用;
、|
等。 -
开启 CASESENSITIVE 或 NOSTEM
若标签是区分大小写或包含特殊格式,务必使用CASESENSITIVE
;否则可默认小写。 -
索引覆盖
若需返回标签列表本身,请在LOAD
或RETURN
中显式列出该字段,并在建索引时未遗漏。 -
谨慎使用通配符
前缀通配符虽然灵活,但会带来额外扫描开销,影响查询延迟。 -
避免过度分片
虽可定义多达 1024 个 Tag 字段,但每个字段都占用索引空间,根据应用场景合理规划字段数。
八、总结
Redis Tag 字段以其内存压缩、查询高效的特点,非常适合存储和检索离散枚举值。通过合理设计分隔符、开启必要选项、并掌握查询语法中的并集/交集及通配符用法,您可以在多种业务场景(如分类过滤、权限标签、地域分组等)下,获得极佳的查询性能和低内存占用。希望本文能帮助您快速上手 Redis Tag 字段并应用于生产环境中。