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
-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
- 西班牙语双元音
有关更多信息,请参阅音韵匹配.
-
对于
TEXT
属性,WEIGHT {weight}
声明了计算结果准确性时该属性的重要性。这是一个乘法因子,如果未指定,则默认为 1。 -
对于
TAG
属性,SEPARATOR {sep}
表示如何将属性中包含的文本拆分为单个标签。默认值为,
。该值必须是一个字符。 -
对于
TAG
属性,CASESENSITIVE
保留标签的原始字母大小写。如果未指定,则字符将转换为小写。 -
对于
TEXT
和TAG
属性,WITHSUFFIXTRIE
保留所有与后缀匹配的术语的后缀 trie。它用于优化contains
(foo) 和suffix
(*foo) 查询。否则,将对 trie 执行暴力搜索。如果某些字段存在后缀 trie,则这些查询将针对其他字段禁用。 -
对于
TEXT
和TAG
属性,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
属性同时作为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>
。
使用 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
另请参阅
相关主题
历史记录
- 从 Redis 2.0.0 版本开始:添加了
PAYLOAD_FIELD
参数,以向后支持已弃用的FT.SEARCH
WITHPAYLOADS
参数 - 从 Redis 2.0.0 版本开始:已弃用
PAYLOAD_FIELD
参数