*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 值集合。