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 Open Source / Search 1.0.0
- 时间复杂度
- 创建时为 O(K),其中 K 是字段数量;如果触发键空间扫描,则为 O(N),其中 N 是键空间中的键数量
- ACL 类别
-
@search,
描述
根据给定规范创建一个索引。有关用法,请参阅示例。
必选参数
index
要创建的索引名称。如果该索引已存在,则返回错误回复 (error) Index already exists。
SCHEMA {identifier} AS {attribute} {attribute type} {options...
在 SCHEMA 关键字之后,声明要索引的字段
-
{identifier}对于哈希而言,是哈希中的字段名称。对于 JSON 而言,identifier 是一个 JSON Path 表达式。 -
AS {attribute}定义了与 identifier 相关联的属性。例如,您可以使用此功能为复杂的 JSONPath 表达式设置一个更容易记忆(且更容易输入)的别名。
字段类型包括
-
TEXT- 允许对该属性中的值执行全文搜索查询。 -
TAG- 允许对该属性中的值执行精确匹配查询,例如类别或主键。有关更多信息,请参阅标签字段。 -
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,UNF在使用SORTABLE时是隐式的(归一化已禁用)。 -
NOSTEM- TEXT 属性可以有 NOSTEM 参数,它在索引其值时禁用词干提取。这对于专有名词等情况可能很理想。 -
NOINDEX- 属性可以有NOINDEX选项,这意味着它们不会被索引。这与SORTABLE结合使用很有用,可以创建通过 PARTIAL 更新时不会导致文档完全重新索引的属性。如果属性有 NOINDEX 且没有 SORTABLE,索引将直接忽略它。 -
PHONETIC {matcher}- 将 TEXT 属性声明为PHONETIC将在搜索时默认对其执行语音匹配。必选参数 {matcher} 指定所使用的语音算法和语言。支持以下匹配器dm:en- 英语的 Double metaphone 算法dm:fr- 法语的 Double metaphone 算法dm:pt- 葡萄牙语的 Double metaphone 算法dm:es- 西班牙语的 Double metaphone 算法
有关更多信息,请参阅语音匹配。
-
WEIGHT {weight}用于TEXT属性,声明此属性在计算结果准确性时的重要性。这是一个乘数因子,如果未指定,则默认为 1。 -
SEPARATOR {sep}用于TAG属性,指示属性中包含的文本如何分割成单独的标签。默认为,。值必须是单个字符。 -
CASESENSITIVE用于TAG属性,保留标签的原始字母大小写。如果未指定,字符将转换为小写。 -
WITHSUFFIXTRIE用于TEXT和TAG属性,保留一个后缀树,包含所有匹配后缀的术语。它用于优化contains(foo) 和suffix(*foo) 查询。否则,将对树进行暴力搜索。如果某些字段存在后缀树,则其他字段的这些查询将被禁用。 -
INDEXEMPTY用于TEXT和TAG属性,在 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),该算法将文本分段并对照预定义词典进行检查。有关更多信息,请参阅词干提取。
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 每个 schema 最多支持 1024 个属性,其中最多 128 个可以是 TEXT 属性。在 32 位构建版本中,最多 64 个属性可以是 TEXT 属性。属性越多,索引越大,因为每增加 8 个属性,每个索引记录就需要额外一个字节进行编码。如果您不需要按 TEXT 属性过滤,总是可以使用
NOFIELDS选项,不将属性信息编码到索引中,以节省空间。这仍然允许按 NUMERIC 和 GEO 属性过滤。 -
**在集群数据库中运行:** 在集群数据库中有多个索引时,您需要确保要索引的文档与索引位于同一个分片上。您可以通过使用索引名称标记文档来实现这一点。
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 属性同时索引为 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:<id>,而图书数据的键使用模式 book:details:<id>。
索引姓名以 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 ";"使用 JSON Path 表达式索引 JSON 文档
以下示例使用与上述哈希示例类似的数据,但改用 JSON。
127.0.0.1:6379> FT.CREATE idx ON JSON SCHEMA $.title AS title TEXT $.categories AS categories TAG另请参阅
相关主题
历史
- 从 Redis 2.0.0 版本开始:添加了
PAYLOAD_FIELD参数,用于向后兼容FT.SEARCH中已弃用的WITHPAYLOADS参数 - 从 Redis 2.0.0 版本开始:弃用
PAYLOAD_FIELD参数