字段和类型选项
可用的字段类型和选项。
Redis Stack 提供了各种字段类型,允许您在索引中存储和搜索不同类型的数据。本页介绍了可用的字段类型、它们的特征以及如何有效地使用它们。
数值字段
数值字段用于存储非文本的可计数值。它们可以保存整数或浮点值。数值字段是可排序的,这意味着您可以执行基于范围的查询并根据特定的数值条件检索文档。例如,您可以搜索价格在特定范围之间的文档,或检索具有特定评级值的文档。
您可以在FT.CREATE
使用以下语法:
FT.CREATE ... SCHEMA ... {field_name} NUMERIC [SORTABLE] [NOINDEX]
哪里:
SORTABLE
表示该字段可以排序。这对于执行范围查询和根据数值对搜索结果进行排序非常有用。NOINDEX
表示该字段未编制索引。这对于存储不想搜索但要在搜索结果中检索的数值非常有用。
您可以使用@<field_name>:[<min> <max>]
query 语法。例如,此查询查找价格介于 200 和 300 之间的文档:
FT.SEARCH products "@price:[200 300]"
您还可以使用以下查询语法来执行更复杂的数值查询:
比较运算符 | 查询字符串 | 评论 |
---|---|---|
最小值 <= x <= 最大值 | @field:[最小最大值] | 全包系列 |
“@field>=最小值 @field<=最大值” | 全包范围 * | |
最小值 < x 最大值 < | @field:[(min (max] | 完全独家系列 |
“@field>min @field<max” | 完全独家系列 * | |
带空格的分组表示 AND 关系 | ||
x >= 最小值 | @field:[min +inf] | 上限开放范围 |
@field>=分钟 | 上限开放范围 * | |
x <= 最大值 | @field:[-inf max] | 较低的开放范围 |
@field<=最大 | 较低的开放范围 * | |
x == 值 | @field:[val val] | 平等 |
@field:[val] | 平等* | |
@field==val | 平等* | |
x != 瓦尔 | -@field:[瓦尔瓦尔] | 不等于 |
@field!=val | 不等于 * | |
x == 值1 或 x == 值2 | “@field==val1 |@field==val2” | 带条形的分组表示 OR 关系 * |
* RediSearch v2.10 的新语法。需要DIALECT 2
.
Geo 字段
Geo 字段用于存储地理坐标,例如经度和纬度。它们支持地理空间半径查询,从而允许您在应用程序中实现基于位置的搜索功能,例如查找附近的餐馆、商店或任何其他兴趣点。
Redis 查询引擎还支持更高级的 geoshape 字段 地理空间查询。有关两种架构类型的格式和用法的介绍,请参阅地理空间参考页面。
您可以在FT.CREATE
使用以下语法:
FT.CREATE ... SCHEMA ... {field_name} GEO [SORTABLE] [NOINDEX]
哪里:
SORTABLE
表示该字段可以排序。这对于执行范围查询和根据坐标对搜索结果进行排序非常有用。NOINDEX
表示该字段未编制索引。这对于存储您不想搜索但仍想在搜索结果中检索的坐标非常有用。
您可以使用@<field_name>:[<lon> <lat> <radius> <unit>]
query 语法。例如,此查询查找距离该点 1000 千米范围内的文档2.34, 48.86
:
FT.SEARCH cities "@coords:[2.34 48.86 1000 km]"
有关更多信息和代码示例,请参阅地理空间查询。
Geoshape 字段
Geoshape 字段提供比 Geo 更高级的功能。 您可以使用它们将位置表示为点,也可以定义 shapes 并查询点和形状之间的交互(例如 以查找包含在封闭形状中的所有点)。您可以 还可以在地理坐标(在球体的表面上)之间进行选择 或标准笛卡尔坐标。使用 geoshape 字段进行空间查询 例如查找指定区域中的所有办公地点或查找 建筑物中 Wi-Fi 路由器范围内的所有房间。
请参阅 地理空间参考 页面,了解 geoshape 和 geo schema 类型。
将 geoshape 字段添加到架构中FT.CREATE
使用以下语法:
FT.CREATE ... SCHEMA ... {field_name} GEOSHAPE [FLAT|SPHERICAL] [NOINDEX]
哪里:
FLAT
表示笛卡尔(平面)坐标。SPHERICAL
表示球面(地理)坐标。这是 default 选项。NOINDEX
表示该字段未编制索引。这对于存储 您不想搜索但仍想检索的坐标 在搜索结果中。
请注意,与 geo 字段不同,geoshape 字段不支持SORTABLE
选择。
使用语法查询 geoshape 字段@<field_name>:[<OPERATION> <shape>]
哪里<operation>
是其中之一WITHIN
,CONTAINS
,INTERSECTS
或DISJOINT
,
和<shape>
是感兴趣的形状,以 Well-known text 格式指定。例如,下面的查询查找包含点 (2, 2) 的形状:
FT.SEARCH idx "(@geom:[CONTAINS $qshape])" PARAMS 2 qshape "POINT (2 2)" RETURN 1 name DIALECT 2
有关更多信息和代码示例,请参阅地理空间查询。
向量场
向量字段是浮点向量,通常由外部机器学习模型生成。这些向量表示非结构化数据,例如文本、图像或其他复杂特征。Redis Stack 允许您使用向量搜索算法(如余弦相似度、欧几里得距离和内积)搜索相似向量。这使您能够构建高级搜索应用程序、推荐系统或内容相似性分析。
您可以在FT.CREATE
使用以下语法:
FT.CREATE ... SCHEMA ... {field_name} VECTOR {algorithm} {count} [{attribute_name} {attribute_value} ...]
哪里:
-
{algorithm}
必须指定,并且是受支持的向量相似性索引算法。支持的算法包括:FLAT
:暴力破解算法。HNSW
:分层、可导航、小世界算法。
这
{algorithm}
attribute 指定搜索时要使用的算法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}
是用于创建向量索引的算法属性。每个算法都有自己的 mandatory 和 optional 属性。
有关向量字段的更多信息,请参阅向量字段。
标记字段
标记字段用于存储表示数据标记或标签集合的文本数据。标记字段的特点是其低基数,这意味着它们通常具有有限数量的 distinct 值。与文本字段不同,标记字段按原样存储,无需分词或词干提取。它们可用于组织和分类数据,从而更轻松地根据特定标签筛选和检索文档。
可以使用以下语法将标记字段添加到架构中:
FT.CREATE ... SCHEMA ... {field_name} TAG [SEPARATOR {sep}] [CASESENSITIVE]
哪里
-
SEPARATOR
默认为逗号 (,
),可以是任何可打印的 ASCII 字符。它用于分隔字段值中的标记。例如,如果字段值为hello,world
,则标签为hello
和world
. -
CASESENSITIVE
表示该字段区分大小写。默认情况下,标记字段不区分大小写。
您可以使用@<field_name>:{<tag>}
query 语法。例如,此查询查找带有blue
:
FT.SEARCH idx "@tags:{blue}"
有关 tag 字段的更多信息,请参阅 Tag 字段。
文本字段
文本字段专为存储人类语言文本而设计。在为文本字段编制索引时,Redis Stack 会执行多种转换以优化搜索功能。文本将转换为小写,从而允许不区分大小写的搜索。数据被标记化,这意味着它被拆分为单个单词或标记,从而实现高效的全文搜索功能。可以对文本字段进行加权,以便在搜索作期间为特定字段分配不同级别的重要性。此外,还可以根据文本字段的值对文本字段进行排序,从而可以按相关性或其他标准对搜索结果进行排序。
可以使用以下语法将文本字段添加到架构中:
FT.CREATE ... SCHEMA ... {field_name} TEXT [WEIGHT] [NOSTEM] [PHONETIC {matcher}] [SORTABLE] [NOINDEX] [WITHSUFFIXTRIE]
哪里
-
WEIGHT
表示该字段已加权。这对于在搜索作期间为特定字段分配不同级别的重要性非常有用。 -
NOSTEM
表示该字段未进行词干提取。这对于存储您不希望被标记化的文本(如 URL 或电子邮件地址)非常有用。 -
PHONETIC {matcher}
将 text 属性声明为PHONETIC
将在搜索中默认对其进行语音匹配。强制性 matcher 参数指定使用的语音算法和语言。支持以下匹配器:dm:en
- 英语的 double metaphonedm:fr
- 法语的双变音器dm:pt
- 葡萄牙语的 double metaphonedm:es
- 西班牙语的 double metaphone
有关详细信息,请参阅 拼音匹配。
-
SORTABLE
表示该字段可以排序。这对于执行范围查询和根据文本值对搜索结果进行排序非常有用。 -
NOINDEX
表示该字段未编制索引。这对于存储您不想搜索但仍想在搜索结果中检索的文本非常有用。 -
WITHSUFFIXTRIE
表示将使用后缀 trie 为字段编制索引。索引将保留一个后缀 trie,其中包含与后缀匹配的所有术语。它用于优化contains (*foo*)
和suffix (*foo)
查询。否则,将对 trie 执行暴力搜索。如果某些字段存在后缀 trie,则其他字段将禁用这些查询。
您可以使用<term>
或@<field_name>:{<term>}
query 语法。以下是几个示例:
-
在每个 text 属性中搜索一个词:
FT.SEARCH books-idx "wizard"
-
仅在
title
属性FT.SEARCH books-idx "@title:dogs"
Unicode 注意事项
Redis 查询引擎仅支持基本多语言平面中的 Unicode 字符;U+0000 到 U+FFFF。在以下使用案例中,不支持 U+FFFF 以外的 Unicode 字符(例如表情符号),并且包含此类字符的查询不会检索这些字符:
- 查询带有前缀/后缀/中缀的 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