一、引言
在 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: schema name text price numeric tags 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: schema name text cities 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 字段并应用于生产环境中。
到此这篇关于redis tag 字段详解与最佳实践的文章就介绍到这了,更多相关redis tag 字段内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论