1. 数值字段(NUMERIC)
用途:存储整数或浮点数,可进行范围查询与排序。
选项:
SORTABLE
:允许用SORTBY
排序NOINDEX
:不参与索引,仅供返回
定义语法
FT.CREATE idx ON HASH PREFIX 1 prod:
SCHEMA
price NUMERIC [SORTABLE] [NOINDEX]
查询示例
# 查找 price 在 200 到 300 之间的文档
FT.SEARCH idx "@price:[200 300]"
# 开区间
FT.SEARCH idx "@price:[(100 (200]"
# 上下界省略表示 ±∞
FT.SEARCH idx "@price:[500 +inf]"
2. 地理坐标字段(GEO)
用途:存储经纬度(lon,lat),支持半径范围检索。
选项:
SORTABLE
:允许排序NOINDEX
:仅供返回,不参与检索
定义语法
FT.CREATE idx ON HASH PREFIX 1 city:
SCHEMA
coords GEO [SORTABLE] [NOINDEX]
查询示例
# 查找距离 (2.34,48.86) 1000 公里内的城市
FT.SEARCH idx "@coords:[2.34 48.86 1000 km]"
更多地理形状(Geoshape)请见下节。
3. 地理形状字段(GEOSHAPE)
用途:存储点、线、面等几何体,支持点在形状内、形状相交等高级空间查询。
坐标类型:
SPHERICAL
(默认):地球球面坐标FLAT
:平面笛卡尔坐标
选项:
NOINDEX
:仅供返回
定义语法
FT.CREATE idx ON HASH PREFIX 1 region:
SCHEMA
area GEOSHAPE [FLAT|SPHERICAL] [NOINDEX]
查询示例
# 找出包含点 (2,2) 的几何体(需 DIALECT 2)
FT.SEARCH idx "(@area:[CONTAINS $pt])"
PARAMS 2 pt "POINT (2 2)"
RETURN 1 name
DIALECT 2
4. 向量字段(VECTOR)
用途:存储机器学习生成的浮点向量,支持 KNN 相似度检索。
算法:
FLAT
:暴力搜索HNSW
:小世界图
必选属性:
TYPE
:数据类型,如FLOAT32
DIM
:向量维度DISTANCE_METRIC
:L2
、IP
(内积)等
可选属性(视算法而定):如
M
,EF_CONSTRUCTION
(HNSW)等
定义语法
FT.CREATE idx ON HASH PREFIX 1 vec:
SCHEMA
embedding VECTOR FLAT 6
TYPE FLOAT32 DIM 128 DISTANCE_METRIC L2
- 这里
6
表示后面跟了 6 个属性:TYPE
、FLOAT32
、DIM
、128
、DISTANCE_METRIC
、L2
。
5. 标签字段(TAG)
用途:存储有限离散值,如类别、状态码等,按完整值匹配,无分词。
选项:
SEPARATOR <char>
:自定义多值分隔符(默认,
)CASESENSITIVE
:大小写敏感(默认不敏感)SORTABLE
:支持排序NOINDEX
:不参与索引
定义语法
FT.CREATE idx ON HASH PREFIX 1 doc:
SCHEMA
tags TAG [SEPARATOR "|" ] [CASESENSITIVE] [SORTABLE]
查询示例
# 查找包含标签 blue 的文档
FT.SEARCH idx "@tags:{blue}"
6. 文本字段(TEXT)
用途:全文检索,分词、词干提取,支持权重与排序。
选项:
WEIGHT <float>
:字段相关度权重(默认 1.0)NOSTEM
:关闭词干提取PHONETIC <matcher>
:启用双音素搜索(dm:en
等)SORTABLE
:支持排序NOINDEX
:不参与索引,仅供返回WITHSUFFIXTRIE
:为后缀/通配查询构建后缀树
定义语法
FT.CREATE idx ON HASH PREFIX 1 blog:
SCHEMA
title TEXT [WEIGHT 2.0] [SORTABLE]
content TEXT NOSTEM
email TEXT PHONETIC dm:en
查询示例
# 任意文本字段中搜索 wizard
FT.SEARCH idx "wizard"
# 仅在 title 搜索 dogs
FT.SEARCH idx "@title:dogs"
7. Unicode 注意事项
- RediSearch 仅支持 BMP(U+0000–U+FFFF)字符;超出此范围的字符(如部分 Emoji)不能用于前缀/后缀/通配或模糊查询。
- 示例:对
😀😁🙂
等字符的前缀查询无效。
八、最佳实践
- 字段选型:根据业务场景选择合适类型,避免全部用 TEXT 导致索引膨胀。
- 索引与存储分离:对只需返回但不检索的字段使用
NOINDEX
,节省内存。 - 排序字段:仅对必要字段加
SORTABLE
,过多 sortable 将增加内存开销。 - 权重调整:对标题或关键字段使用
WEIGHT
提升相关度。 - 合理分隔:TAG 多值字段尽量指定
SEPARATOR
,避免与默认逗号冲突。
通过以上示例与说明,你已掌握 RediSearch 的所有字段类型及其关键配置选项。结合业务需求和数据特点,灵活调整 Schema,既可实现强大的搜索功能,又能最大限度地优化内存与查询性能。