RediSearch 字段类型与配置选项

发布于:2025-07-04 ⋅ 阅读:(15) ⋅ 点赞:(0)

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_METRICL2IP(内积)等
  • 可选属性(视算法而定):如 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 个属性:TYPEFLOAT32DIM128DISTANCE_METRICL2

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)不能用于前缀/后缀/通配或模糊查询。
  • 示例:对 😀😁🙂 等字符的前缀查询无效。

八、最佳实践

  1. 字段选型:根据业务场景选择合适类型,避免全部用 TEXT 导致索引膨胀。
  2. 索引与存储分离:对只需返回但不检索的字段使用 NOINDEX,节省内存。
  3. 排序字段:仅对必要字段加 SORTABLE,过多 sortable 将增加内存开销。
  4. 权重调整:对标题或关键字段使用 WEIGHT 提升相关度。
  5. 合理分隔:TAG 多值字段尽量指定 SEPARATOR,避免与默认逗号冲突。

通过以上示例与说明,你已掌握 RediSearch 的所有字段类型及其关键配置选项。结合业务需求和数据特点,灵活调整 Schema,既可实现强大的搜索功能,又能最大限度地优化内存与查询性能。