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] ...]
- 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,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。 -
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),该算法对文本进行分词并与预定义的词典进行核对。有关更多信息,请参见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
另请参阅
相关主题
历史
- 从Redis版本2.0.0开始:添加了
PAYLOAD_FIELD
参数,以向后支持FT.SEARCH
中已弃用的WITHPAYLOADS
参数 - 从 Redis 版本 2.0.0 开始:已弃用
PAYLOAD_FIELD
参数