字段和类型选项

可用的字段类型和选项。

Redis 开源版提供了各种字段类型,您可以在索引中存储和搜索不同类型的数据。本页解释了可用的字段类型、其特性以及如何有效地使用它们。

数值字段

数值字段用于存储非文本、可计数的值。它们可以保存整数或浮点数值。数值字段可排序,这意味着您可以执行基于范围的查询,并根据特定的数值条件检索文档。例如,您可以搜索价格在特定范围内的文档,或检索具有特定评分值的文档。

您可以在 FT.CREATE 中使用此语法将数值字段添加到模式中

FT.CREATE ... SCHEMA ... {field_name} NUMERIC [SORTABLE] [NOINDEX]

其中

  • SORTABLE 表示字段可以排序。这对于执行范围查询和根据数值排序搜索结果很有用。
  • NOINDEX 表示字段未被索引。这对于存储您不想搜索但希望在搜索结果中检索的数值非常有用。

您可以使用 @<field_name>:[<min> <max>] 查询语法搜索具有特定数值的文档。例如,此查询查找价格在 200 到 300 之间的文档

FT.SEARCH products "@price:[200 300]"

您还可以使用以下查询语法执行更复杂的数值查询

比较运算符 查询字符串 注释
min <= x <= max @field:[min max] 完全包含范围
"@field>=min @field<=max" 完全包含范围 *
min < x < max @field:[(min (max] 完全排除范围
"@field>min @field<max" 完全排除范围 *
用空格分组表示 AND 关系
x >= min @field:[min +inf] 上限开放范围
@field>=min 上限开放范围 *
x <= max @field:[-inf max] 下限开放范围
@field<=max 下限开放范围 *
x == val @field:[val val] 等于
@field:[val] 等于 *
@field==val 等于 *
x != val -@field:[val val] 不等于
@field!=val 不等于 *
x == val1 or x == val2 "@field==val1 | @field==val2" 用竖线分组表示 OR 关系 *

* RediSearch v2.10 及更高版本的新语法。需要 DIALECT 2

地理字段

地理字段用于存储地理坐标,例如经度和纬度。它们支持地理空间半径查询,使您能够在应用程序中实现基于位置的搜索功能,例如查找附近的餐馆、商店或任何其他兴趣点。

Redis 查询引擎还支持 geoshape 字段以进行更高级的地理空间查询。请参阅地理空间参考页面,了解这两种模式类型的格式和用法介绍。

您可以在 FT.CREATE 中使用此语法将地理字段添加到模式中

FT.CREATE ... SCHEMA ... {field_name} GEO [SORTABLE] [NOINDEX]

其中

  • SORTABLE 表示字段可以排序。这对于执行范围查询和根据坐标排序搜索结果很有用。
  • NOINDEX 表示字段未被索引。这对于存储您不想搜索但仍希望在搜索结果中检索的坐标非常有用。

您可以使用 @<field_name>:[<lon> <lat> <radius> <unit>] 查询语法查询地理字段。例如,此查询查找距离点 2.34, 48.86 1000 公里范围内的文档

FT.SEARCH cities "@coords:[2.34 48.86 1000 km]"

有关更多信息和代码示例,请参阅地理空间查询

Geoshape 字段

Geoshape 字段提供了比地理字段更高级的功能。您可以使用它们将位置表示为点,也可以定义形状并查询点和形状之间的交互(例如,查找包含在封闭形状内的所有点)。您还可以选择地理坐标(球体表面)或标准笛卡尔坐标。使用 geoshape 字段进行空间查询,例如查找指定区域内的所有办公地点或查找建筑物内落在 Wi-Fi 路由器范围内的所有房间。

请参阅地理空间参考页面,了解 geoshape 和地理模式类型的格式和用法介绍。

使用以下语法将 geoshape 字段添加到 FT.CREATE 中的模式中

FT.CREATE ... SCHEMA ... {field_name} GEOSHAPE [FLAT|SPHERICAL] [NOINDEX]

其中

  • FLAT 表示笛卡尔(平面)坐标。
  • SPHERICAL 表示球形(地理)坐标。如果您没有显式指定,这是默认选项。
  • NOINDEX 表示字段未被索引。这对于存储您不想搜索但仍希望在搜索结果中检索的坐标非常有用。

请注意,与地理字段不同,geoshape 字段不支持 SORTABLE 选项。

使用语法 @<field_name>:[<OPERATION> <shape>] 查询 geoshape 字段,其中 <operation>WITHINCONTAINSINTERSECTSDISJOINT 之一,<shape> 是感兴趣的形状,以 Well-known text 格式指定。例如,下面的查询查找包含点 (2, 2) 的形状

FT.SEARCH idx "(@geom:[CONTAINS $qshape])" PARAMS 2 qshape "POINT (2 2)" RETURN 1 name DIALECT 2

有关更多信息和代码示例,请参阅地理空间查询

向量字段

向量字段是通常由外部机器学习模型生成的浮点向量。这些向量表示非结构化数据,例如文本、图像或其他复杂特征。Redis 允许您使用余弦相似度、欧几里得距离和内积等向量搜索算法搜索相似的向量。这使您能够构建高级搜索应用程序、推荐系统或内容相似性分析。

您可以在 FT.CREATE 中使用此语法将向量字段添加到模式中

FT.CREATE ... SCHEMA ... {field_name} VECTOR {algorithm} {count} [{attribute_name} {attribute_value} ...]

其中

  • 必须指定 {algorithm} 且必须是支持的向量相似度索引算法。支持的算法包括

    • FLAT:暴力算法。
    • HNSW:分层、可导航、小世界算法。

    {algorithm} 属性指定在索引中搜索 k 个最相似向量或按范围过滤向量时使用的算法。

  • {count} 指定索引的属性数量,并且必须存在。请注意,{count} 代表命令中传递的属性对总数。算法参数应作为命名参数提交。

    例如

    FT.CREATE my_idx SCHEMA vec_field VECTOR FLAT 6 TYPE FLOAT32 DIM 128 DISTANCE_METRIC L2
    

    此处,为索引传递了三个参数 (TYPE, DIM, DISTANCE_METRIC),count 是属性总数 (6)。

  • {attribute_name} {attribute_value} 是用于创建向量索引的算法属性。每种算法都有自己的强制和可选属性。

有关向量字段的更多信息,请参阅向量字段

标签字段

标签字段用于存储表示数据标签集合的文本数据。标签字段的特点是基数低,这意味着它们通常具有有限数量的不同值。与文本字段不同,标签字段按原样存储,不进行分词或词干提取。它们有助于组织和分类数据,从而更轻松地根据特定标签过滤和检索文档。

可以使用以下语法将标签字段添加到模式中

FT.CREATE ... SCHEMA ... {field_name} TAG [SEPARATOR {sep}] [CASESENSITIVE]

其中

  • SEPARATOR 默认为逗号 (,),可以是任何可打印的 ASCII 字符。它用于分隔字段值中的标签。例如,如果字段值为 hello,world,则标签是 helloworld

  • CASESENSITIVE 表示字段区分大小写。默认情况下,标签字段不区分大小写。

您可以使用 @<field_name>:{<tag>} 查询语法搜索具有特定标签的文档。例如,此查询查找带有标签 blue 的文档

FT.SEARCH idx "@tags:{blue}"

有关标签字段的更多信息,请参阅标签字段

文本字段

文本字段专为存储人类语言文本而设计。索引文本字段时,Redis 会执行多项转换以优化搜索功能。文本会转换为小写,从而允许不区分大小写的搜索。数据会被分词,这意味着它会被分割成单独的单词或标记,从而实现高效的全文搜索功能。文本字段可以加权,以便在搜索操作期间为特定字段分配不同的重要性级别。此外,文本字段可以根据其值进行排序,从而能够按相关性或其他标准对搜索结果进行排序。

可以使用以下语法将文本字段添加到模式中

FT.CREATE ... SCHEMA ... {field_name} TEXT [WEIGHT] [NOSTEM] [PHONETIC {matcher}] [SORTABLE] [NOINDEX] [WITHSUFFIXTRIE]

其中

  • WEIGHT 表示字段已加权。这对于在搜索操作期间为特定字段分配不同的重要性级别非常有用。

  • NOSTEM 表示字段未进行词干提取。这对于存储您不希望分词的文本(例如 URL 或电子邮件地址)非常有用。

  • 声明文本属性为 PHONETIC {matcher},默认情况下将在搜索中对其执行语音匹配。强制性的 matcher 参数指定使用的语音算法和语言。支持以下 matcher

    • dm:en - 英语的双元音码
    • dm:fr - 法语的双元音码
    • dm:pt - 葡萄牙语的双元音码
    • dm:es - 西班牙语的双元音码

    有关更多信息,请参阅语音匹配

  • SORTABLE 表示字段可以排序。这对于执行范围查询和根据文本值排序搜索结果很有用。

  • NOINDEX 表示字段未被索引。这对于存储您不想搜索但仍希望在搜索结果中检索的文本非常有用。

  • WITHSUFFIXTRIE 表示该字段将使用后缀树进行索引。索引将保留与后缀匹配的所有术语的后缀树。它用于优化 contains (*foo*)suffix (*foo) 查询。否则,将对 trie 进行暴力搜索。如果某些字段存在后缀树,则对其他字段禁用这些查询。

您可以使用 <term>@<field_name>:{<term>} 查询语法搜索具有特定文本值的文档。以下是几个示例

  • 在每个文本属性中搜索术语

    FT.SEARCH books-idx "wizard"
    
  • 仅在 title 属性中搜索术语

    FT.SEARCH books-idx "@title:dogs"
    

Unicode 注意事项

Redis 查询引擎仅支持基本多文种平面中的 Unicode 字符;U+0000 到 U+FFFF。超出 U+FFFF 的 Unicode 字符(例如 Emoji)不受支持,并且在以下用例中包含此类字符的查询将无法检索到它们

  • 使用前缀/后缀/中缀查询 TEXT 字段
  • 使用模糊查询 TEXT 字段

示例

redis> FT.CREATE idx SCHEMA tag TAG text TEXT
OK
redis> HSET doc:1 tag '😀😁🙂' text '😀😁🙂'
(integer) 2
redis> HSET doc:2 tag '😀😁🙂abc' text '😀😁🙂abc'
(integer) 2
redis> FT.SEARCH idx '@text:(*😀😁🙂)' NOCONTENT
1) (integer) 0
redis> FT.SEARCH idx '@text:(*😀😁🙂*)' NOCONTENT
1) (integer) 0
redis> FT.SEARCH idx '@text:(😀😁🙂*)' NOCONTENT
1) (integer) 0

redis> FT.SEARCH idx '@text:(%😀😁🙃%)' NOCONTENT
1) (integer) 0
评价本页
返回顶部 ↑