FT.CREATE

创建具有给定规格的索引

语法

FT.CREATE index [ON ] [PREFIX count prefix [prefix ...]] [FILTER filter] [LANGUAGE default lang] [LANGUAGE FIELD lang attribute] [SCORE default score] [SCORE FIELD score attribute] [PAYLOAD FIELD payload attribute] [MAXTEXTFIELDS] [TEMPORARY seconds] [NOOFFSETS] [NOHL] [NOFIELDS] [NOFREQS] [STOPWORDS count [stopword [stopword ...]]] [SKIPINITIALSCAN] [INDEXALL ] SCHEMA field name [AS alias] [WITHSUFFIXTRIE] [INDEXEMPTY] [INDEXMISSING] [SORTABLE [UNF]] [NOINDEX] [field name [AS alias] [WITHSUFFIXTRIE] [INDEXEMPTY] [INDEXMISSING] [SORTABLE [UNF]] [NOINDEX] ...]

引入版本:1.0.0

复杂度摘要:O(K)

说明

创建具有给定规范的索引。使用方法请参见示例。

必需参数

index

是要创建的索引名称。如果该索引已存在,则返回错误回复 (error) Index already exists。

SCHEMA {identifier} AS {attribute} {attribute type} {options...

在SCHEMA关键字之后,声明要索引的字段:

  • {identifier} 用于哈希,是哈希中的字段名称。对于 JSON,标识符是 JSON 路径表达式。

  • AS {attribute} 定义与标识符关联的属性。例如,您可以使用此功能为复杂的 JSONPath 表达式添加更容易记住(并且更易于键入)的名称。

字段类型有:

  • TEXT - 允许针对此属性中的值进行全文搜索查询。

  • TAG - 允许针对此属性中的值进行精确匹配查询,例如类别或主键。有关更多信息,请参阅标签字段。

  • NUMERIC - 允许针对此属性中的值进行数字范围查询。有关如何使用数字范围的详细信息,请参阅 查询语法文档。

  • GEO - 允许针对此属性中的值(点)进行半径范围查询。该属性的值必须是一个字符串,其中包含以逗号分隔的经度(第一个)和纬度。

  • VECTOR - 允许针对此属性中的值进行矢量查询。这需要查询方言2或以上版本(RediSearch v2.4中引入)。有关更多信息,请参阅 向量场。

  • GEOSHAPE - 允许针对此属性中的值进行多边形查询。该属性的值必须遵循 WKT表示法 2D 点列表,这些点表示以逗号分隔的多边形边 POLYGON((x1 y1, x2 y2, ...)。 GEOSHAPE 字段类型后可以跟以下坐标系之一:

  • SPHERICAL 地理经纬度坐标
  • FLAT 用于笛卡尔 X Y 坐标

    默认坐标系为SPHERICAL。

    目前GEOSHAPE不支持JSON多值和SORTABLE选项。

字段选项有:

  • SORTABLE - NUMERIC、TAG、TEXT 或 GEO 属性可以具有可选的 SORTABLE 参数。作为用户 按该属性的值对结果进行排序,可以以非常低的延迟获得结果。请注意,他会增加内存开销,因此请考虑不要在大文本属性上声明它。您可以在不使用 SORTABLE 选项的情况下对属性进行排序,但延迟不如使用 SORTABLE 那样好。

  • UNF - 默认情况下,对于哈希(不使用 JSON),SORTABLE 对索引值应用标准化(字符设置为小写,删除变音符号)。使用非标准化形式 (UNF) 时,您可以禁用标准化并保留值的原始形式。对于 JSON,UNF 与 SORTABLE 是隐式的(标准化已禁用)。

  • NOSTEM - 文本属性可以具有 NOSTEM 参数,该参数在对其值进行索引时禁用词干分析。这对于专有名称之类的东西可能是理想的。

  • NOINDEX - 属性可以有 NOINDEX 选项,这意味着它们不会被索引。这与 SORTABLE 结合使用非常有用,可以创建使用 PARTIAL 进行更新不会导致文档完全重新索引的属性。如果属性具有 NOINDEX 并且没有 SORTABLE,则索引将忽略它。

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

  • dm:en - 英语双变音位

  • dm:fr - 法语双变音位
  • dm:pt - 葡萄牙语双变音位
  • dm:es - 西班牙语双变音位

有关详细信息,请参阅 语音匹配。

  • WEIGHT {weight}为TEXT属性,声明该属性在计算结果精度时的重要性。这是一个乘法因子,如果未指定,则默认为 1。

  • TAG 属性的 SEPARATOR {sep} 指示如何将属性中包含的文本拆分为单独的标签。默认为 ,。该值必须是单个字符。

  • TAG 属性的 CASESENSITIVE 保留标签的原始字母大小写。如果未指定,则字符将转换为小写。

  • TEXT 和 TAG 属性的 WITHSUFFIXTRIE 保留一个后缀特里树,其中包含与后缀匹配的所有术语。它用于优化 contains (富) 和 suffix (*foo) 查询。否则,将对 trie 执行强力搜索。如果某些字段存在后缀 trie,则其他字段的这些查询将被禁用。

  • v2.10 中引入的 TEXT 和 TAG 属性的 INDEXEMPTY 允许您索引和搜索空字符串。默认情况下,空字符串不被索引。

  • v2.10 中引入的适用于所有字段类型的 INDEXMISSING 允许您搜索缺失值,即不包含特定字段的文档。请注意具有空值的字段和具有缺失值的文档之间的区别。默认情况下,缺失值不会被索引。

可选参数

ON {data_type}

目前支持HASH(默认)和JSON。要索引 JSON,您必须安装 RedisJSON 模块。

PREFIX {count} {prefix}

告诉索引应该索引哪些键。您可以向索引添加多个前缀。由于该参数是可选的,因此默认值为 *(所有键)。

FILTER {filter}

是一个具有完整RediSearch聚合表达式语言的过滤表达式。可以使用 @__key 访问刚刚添加/更改的键。字段可以通过传递 'FILTER @indexName=="myindexname"' 来设置字段名称。

LANGUAGE {default_lang}

如果设置,则指示索引中文档的默认语言。默认为英语。

LANGUAGE_FIELD {lang_attribute}

是设置为文档语言的文档属性。

词干分析器用于在索引期间提供的语言。如果发送不支持的语言,该命令将返回错误。支持的语言为 arabic、armenian、basque、catalan、chinese(见下文)、danish、dutch、english、finnish、french、german、greek、hindi、hungarian、 indonesian、irish、italian、lithuanian、malay、nepali、norwegian、portuguese、romanian、russian、serbian、spanish、swedish、tagalog、 tamil、turkish 和 yiddish。

添加中文文档时,为索引器设置 LANGUAGE chinese 以正确标记术语。如果您使用默认语言,则会根据标点符号和空格提取搜索词。中文分词器使用分段算法(通过 弗里索),对文本进行分段并根据预定义的字典进行检查。请参阅 词干提取 了解更多信息。

SCORE {default_score}

是索引中文档的默认分数。默认分数为 1.0。

SCORE_FIELD {score_attribute}

是文档属性,根据用户排名用作文档排名。排名必须介于 0.0 和 1.0 之间。如果未设置,则默认分数为 1。

PAYLOAD_FIELD {payload_attribute}

是文档属性,用作文档的二进制安全负载字符串,可以在查询时通过自定义评分函数进行评估或检索到客户端。

MAXTEXTFIELDS

强制 RediSearch 对索引进行编码,就像有超过 32 个文本属性一样,这允许您使用 FT.ALTER 添加其他属性(超过 32 个)。为了提高效率,如果索引是使用少于 32 个文本属性创建的,则 RediSearch 会对索引进行不同的编码。

NOOFFSETS

不存储文档的术语偏移量。它节省内存,但不允许精确搜索或突出显示。它意味着 NOHL。

TEMPORARY {seconds}

创建一个轻量级临时索引,该索引在指定的不活动时间(以秒为单位)后过期。每当搜索或添加索引时,内部空闲计时器都会重置。由于此类索引是轻量级的,因此您可以创建数千个此类索引,而不会产生负面性能影响,因此,您应该考虑使用 SKIPINITIALSCAN 来避免昂贵的扫描。

[!注意]警告

当临时索引过期时,它们会删除与其关联的所有记录。引入 FT.DROPINDEX 时默认不删除文档,并使用 DD 标志强制删除。但是,对于临时索引,文档会与索引一起删除。从历史上看,RediSearch 使用 FT.ADD 命令,该命令在文档和索引之间建立连接。然后,FT.DROP,也是一个历史命令,默认删除文档。在2.x版本中,RediSearch索引哈希和JSON,索引和文档之间的依赖关系不再存在。

NOHL

通过禁用突出显示支持来节省存储空间和内存。如果设置,则不存储术语位置的相应字节偏移量。 NOHL 也由 NOOFFSETS 隐含。

NOFIELDS

不存储每个术语的属性位。它节省内存,但不允许按特定属性进行过滤。

NOFREQS

避免在索引中保存术语频率。它节省内存,但不允许根据文档中给定术语的频率进行排序。

STOPWORDS {count}

使用自定义停用词列表设置索引,在索引和搜索时忽略该列表。 {count} 是停用词的数量,后跟与 {count} 长度完全相同的停用词参数列表。

如果未设置,FT.CREATE 将采用默认的停用词列表。如果 {count} 设置为 0,则索引没有停用词。

SKIPINITIALSCAN

如果设置,则不扫描和索引。

INDEXALL {ENABLE | DISABLE}

v8.0中引入,维护现有文档ID的紧凑索引以优化通配符查询,例如FT.SEARCH idx *。禁用后,通配符查询将扫描所有已分配的 ID(包括已删除的 ID),这可能会损害写入繁重的工作负载中的性能。默认为禁用。

Notes:

  • 属性数量限制: RediSearch 每个架构最多支持 1024 个属性,其中最多 128 个可以是 TEXT 属性。在 32 位版本上,最多 64 个属性可以是 TEXT 属性。属性越多,索引就越大,因为每增加 8 个属性,每个索引记录就需要一个额外的字节进行编码。如果不需要按文本属性进行过滤,您始终可以使用 NOFIELDS 选项,而不将属性信息编码到索引中,以节省空间。这仍然允许按数字和地理属性进行过滤。
  • 在集群数据库中运行: 当集群数据库中有多个索引时,您需要确保要索引的文档与索引驻留在同一分片上。您可以通过使用索引名称标记文档来实现此目的。

127.0.0.1:6379> HSET 文档:1{idx} ... 127.0.0.1:6379> FT.CREATE idx ... 前缀 1 文档: ...

在集群数据库中运行 RediSearch 时,您可以使用 RS协调员 将索引跨分片。在这种情况下,上述内容不适用。

示例

Create an index

创建一个索引,用于存储博客文章哈希的标题、发布日期和类别,其键以 blog:post: 开头(例如 blog:post:1)。

127.0.0.1:6379> FT.CREATE idx ON HASH PREFIX 1 blog:post: SCHEMA title TEXT SORTABLE Publication_at NUMERIC SORTABLE Category TAG SORTABLE OK

将哈希中的 sku 属性索引为 TAG 和 TEXT:

127.0.0.1:6379> FT.CREATE idx ON HASH PREFIX 1 blog:post: SCHEMA sku AS sku_text TEXT sku AS sku_tag 标签可排序

在同一索引中索引两个不同的哈希值,一个包含作者数据,另一个包含书籍:

127.0.0.1:6379> FT.CREATEauthor-books-idx ON HASH PREFIX 2author:details:book:details:SCHEMAauthor_id标签可排序author_ids标签标题文本名称文本

在此示例中,作者数据的键使用键模式 author:details:<id>,而书籍数据的键使用模式 book:details:<id>。

名字以G开头的索引作者。

127.0.0.1:6379> FT.CREATE g-authors-idx ON HASH PREFIX 1author:details FILTER 'startswith(@name, "G")' SCHEMA name TEXT

仅索引有副标题的书籍。

127.0.0.1:6379> FT.CREATE subtitled-books-idx ON HASH PREFIX 1 book:details FILTER '@subtitle != ""' SCHEMA title TEXT

索引具有“类别”属性的书籍,其中每个类别由 ; 字符分隔。

127.0.0.1:6379> FT.CREATE books-idx ON HASH PREFIX 1 book:details SCHEMA title TEXTcategories TAG SEPARATOR ";"

Index a JSON document using a JSON Path expression

以下示例使用与上面的哈希示例类似的数据,但使用 JSON。

127.0.0.1:6379> FT.CREATE idx ON JSON SCHEMA $.title AS 标题 TEXT $.categories AS 类别 TAG

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis软件
Flex
Redis Cloud
灵活且每年
Redis Cloud
免费和固定
说明
✅ 支持 ⚠️ 有限 ✅ 支持 ✅ 支持 对 Flex 数据库 的支持有限。

返回值

RESP2

以下之一: * 简单字符串回复:OK(如果执行正确)。 * 简单错误回复 在这些情况下:索引已存在,架构语法无效。

RESP3

以下之一: * 简单字符串回复:OK(如果执行正确)。 * 简单错误回复 在这些情况下:索引已存在,架构语法无效。

参见

FT.ALTER | FT.DROPINDEX

资料来源:Redis 官方 FT.CREATE 文档;中文内容参考 Redis 文档许可。