FT.CREATE

语法
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] ...]
可用
Redis Stack / Search 1.0.0
时间复杂度
创建时为 O(K),其中 K 是字段数,如果触发扫描键空间,则为 O(N),其中 N 是键空间中的键数

描述

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

必需参数

索引

是要创建的索引名称。如果该索引已存在,则返回错误回复 (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 - NUMERICTAGTEXTGEO 属性可以具有可选的 **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 - 西班牙语双元音

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

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

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

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

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

  • 对于TEXTTAG 属性,INDEXEMPTY 允许您索引和搜索空字符串。默认情况下,空字符串不会被索引。

  • 对于所有字段类型,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}

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

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

添加中文语言文档时,请设置LANGUAGE chinese 以便索引器正确地对术语进行分词。如果您使用默认语言,则搜索词将根据标点符号和空格提取。中文语言分词器使用分词算法 (通过Friso),该算法对文本进行分词并根据预定义词典进行检查。有关更多信息,请参阅词干分析

SCORE {default_score}

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

SCORE_FIELD {score_attribute}

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

PAYLOAD_FIELD {payload_attribute}

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

MAXTEXTFIELDS

强制 RediSearch 将索引编码为好像有超过 32 个文本属性一样,这允许您使用FT.ALTER 添加更多属性 (超过 32 个)。为了提高效率,如果 RediSearch 创建的索引的文本属性少于 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,否则返回错误回复。

示例

创建索引

创建一个索引,该索引存储博客文章哈希的标题、发布时间和类别,这些哈希的键以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 属性同时作为TAGTEXT 进行索引

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:<id>,而书籍数据的键使用键模式book:details:<id>

使用 JSON Path 表达式索引 JSON 文档

索引姓名以 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 FILTER SCHEMA title TEXT categories TAG SEPARATOR ";"

使用 JSON Path 表达式索引 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 ↑