*Redis FT.TAGVALS 命令

FT.TAGVALS 用于返回索引中指定 TAG 字段的所有不同值(去重)。


*语法

FT.TAGVALS index_name field_name

*参数说明

参数 类型 必填 说明
index_name String 索引名称
field_name String TAG 类型的字段名称

*返回值

  • 数组:指定 TAG 字段的所有不同值列表
  • 若字段不存在或索引为空,返回空数组

*时间复杂度

O(n),其中 n 是索引中该 TAG 字段的不同值数量。


*示例

*基本用法

> FT.TAGVALS myIndex category
1) "electronics"
2) "books"
3) "clothing"
4) "food"

*空索引或无 TAG 值

> FT.TAGVALS myIndex emptyField
(empty array)

*常见错误

错误 原因 解决
Unknown index name 索引不存在 检查索引名称或先创建索引
Property is not a TAG field 字段不是 TAG 类型 确认字段在 FT.CREATE 中定义为 TAG 类型
Property not loaded 字段未加载到索引 检查索引配置或字段名称拼写

*最佳实践

  • 用于生成筛选器的选项列表(如电商网站的分类筛选下拉框)
  • 在 UI 中展示 TAG 字段的可用值,避免用户输入无效选项
  • 对于高频访问的 TAG 值列表,建议在客户端缓存结果,减少重复查询
  • 注意:TAG 值可能很多,返回大型数组时考虑分页或分批加载
  • 与 Redis 原生 SMEMBERS 不同,FT.TAGVALS 是从倒排索引中读取,确保数据一致性
  • 可用于数据质量检查,查看某个 TAG 字段是否有异常值

*FAQ

Q1: FT.TAGVALS 返回的值是排序的吗? A: 返回顺序取决于内部索引结构,不保证字母序。如需排序,请在客户端处理。

Q2: 可以返回 TEXT 字段的值列表吗? A: 不可以,FT.TAGVALS 仅适用于 TAG 类型字段。TEXT 字段的值是 tokenized 的,无法通过此命令获取原始值。

Q3: 返回的值数量有上限吗? A: 没有硬编码上限,但受 Redis 的返回大小限制和内存影响。对于超大量的 TAG 值,考虑其他方式获取(如聚合查询)。

Q4: 字段更新后 FT.TAGVALS 会立即反映吗? A: 是的,只要文档已被索引(percent_indexed 为 1),FT.TAGVALS 会返回最新的 TAG 值集合。