FT.CREATE

Syntax
FT.CREATE index 
  [ON HASH | JSON] 
  [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 ...]] 
  [SKIPINITIALSCAN]
  SCHEMA field_name [AS alias] TEXT | TAG | NUMERIC | GEO | VECTOR | GEOSHAPE [ SORTABLE [UNF]] 
  [NOINDEX] [ field_name [AS alias] TEXT | TAG | NUMERIC | GEO | VECTOR | GEOSHAPE [ SORTABLE [UNF]] [NOINDEX] ...]
Available in:
Redis Stack / Search 1.0.0
Time complexity:
O(K) at creation where K is the number of fields, O(N) if scanning the keyspace is triggered, where N is the number of keys in the keyspace

描述

使用给定的规范创建一个索引。有关用法,请参见示例

必需的参数

index

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

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

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

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

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

字段类型有:

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

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

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

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

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

  • GEOSHAPE- 允许对此属性中的值进行多边形查询。属性的值必须遵循WKT表示法的二维点列表,表示多边形的边缘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,UNFSORTABLE是隐含的(规范化被禁用)。

  • NOSTEM - 文本属性可以带有NOSTEM参数,该参数在索引其值时禁用词干提取。这对于像专有名称这样的内容可能是理想的。

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

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

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

    更多信息,请参见 语音匹配

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

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

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

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

  • INDEXEMPTY 用于 TEXTTAG 属性,自 v2.10 版本引入,允许您索引和搜索空字符串。默认情况下,空字符串不会被索引。

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

可选参数

ON {data_type}

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

PREFIX {count} {prefix}

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

FILTER {filter}

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

LANGUAGE {default_lang}

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

LANGUAGE_FIELD {lang_attribute}

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

在索引过程中,词干提取器用于提供的语言。如果发送了不支持的语言,命令将返回错误。支持的语言包括阿拉伯语、巴斯克语、加泰罗尼亚语、丹麦语、荷兰语、英语、芬兰语、法语、德语、希腊语、匈牙利语、印度尼西亚语、爱尔兰语、意大利语、立陶宛语、尼泊尔语、挪威语、葡萄牙语、罗马尼亚语、俄语、西班牙语、瑞典语、泰米尔语、土耳其语和中文。

在添加中文语言文档时,设置LANGUAGE chinese以便索引器正确分词。如果使用默认语言,则搜索词是基于标点符号和空格提取的。中文分词器使用了一种分词算法(通过Friso),该算法对文本进行分词并与预定义的词典进行核对。有关更多信息,请参见Stemming

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

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

备注:

  • 属性数量限制: RediSearch 每个模式最多支持 1024 个属性,其中最多 128 个可以是 TEXT 属性。在 32 位构建中,最多 64 个属性可以是 TEXT 属性。属性越多,索引越大,因为每增加 8 个属性,每个索引记录需要额外一个字节来编码。如果您不需要通过文本属性进行过滤,您可以使用 NOFIELDS 选项,不将属性信息编码到索引中,以节省空间。这仍然允许通过数字和地理属性进行过滤。

  • 在集群数据库中运行: 当在集群数据库中有多个索引时,您需要确保要索引的文档与索引位于同一个分片上。您可以通过为文档标记索引名称来实现这一点。

    127.0.0.1:6379> HSET doc:1{idx} ...
    127.0.0.1:6379> FT.CREATE idx ... PREFIX 1 doc: ...

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

返回

如果执行正确,FT.CREATE 返回一个简单的字符串回复 OK,否则返回错误回复。

示例

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 published_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 TAG SORTABLE

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

127.0.0.1:6379> FT.CREATE author-books-idx ON HASH PREFIX 2 author:details: book:details: SCHEMA
author_id TAG SORTABLE author_ids TAG title TEXT name TEXT

在这个例子中,作者数据的键使用键模式 author:details:,而书籍数据的键使用模式 book:details:

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

127.0.0.1:6379> FT.CREATE g-authors-idx ON HASH PREFIX 1 author: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

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

127.0.0.1:6379> FT.CREATE books-idx ON HASH PREFIX 1 book:details SCHEMA title TEXT categories 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 title TEXT $.categories AS categories TAG

另请参阅

FT.ALTER | FT.DROPINDEX


历史

  • 从Redis版本2.0.0开始:添加了PAYLOAD_FIELD参数,以向后支持FT.SEARCH中已弃用的WITHPAYLOADS参数
  • 从 Redis 版本 2.0.0 开始:已弃用 PAYLOAD_FIELD 参数
RATE THIS PAGE
Back to top ↑