本文介绍创建搜索索引的语法及使用说明。

云原生多模数据库Lindorm支持通过CREATE SEARCH INDEX语句创建搜索索引。搜索索引的详细说明,请参见搜索索引介绍

使用说明

  • 搜索索引主要适用于多维查询场景,支持任意列的排序或分页查询。
  • 一张表只能生成一个搜索索引,可以在原有搜索索引基础上增加新的索引列。
  • 如果历史数据中有新增的列,需要进行一次全量索引构建,支持星号(*)创建所有列的搜索索引。
  • 索引列支持的数据类型包括:TINYINT、SMALLINT、INTEGER、INT、BIGINT、LONG、FLOAT、DOUBLE、VARCHAR、BINARY、VARBINARY、BOOLEAN。

语法

CREATE SEARCH INDEX [ IF NOT EXISTS ] index_name
        ON table_name '(' index_identifier ')'
        [ASYNC]
        [ WITH '(' index_options ')' ]

index_identifier:
(column_name'(' column_options ')' ',' ... column_name'(' column_options ')')* | "*"    
                         
column_options:
option_name '=' option_value (',' option_name '='option_value)

index_options:
option_name '=' option_value (',' option_name '='option_value)

参数

column_options参数的说明。

参数类型描述
indexedString是否需要搜索索引。
  • true:默认值,需要搜索索引。
  • false:不需要搜索索引。
rowStoredString是否存储原始数据。
  • true:存储原始数据。
  • false:默认值,不存储原始数据。
columnStoredString是否设置为列存储,用来加速排序分析。
  • true:默认值,设置列存储。
  • false:不设置列存储。
typeString分词场景下,分词字段需要设置type参数为text,其它情况默认与宽表数据类型保持一致。
说明 需要同时与analyzer分词器使用。
analyzerString分词器列表。取值:
  • standard
  • english
  • ik
  • whitespace
  • comma
说明 需要同时与type参数使用。

index_options参数的说明。

参数类型描述
indexStateString搜索索引状态,取值为:
  • BUILDING:默认值。
  • ACTIVE:即为USABLE,属于启用搜索索引状态。在没有历史数据的场景下,设置为ACTIVE。
numShardsString指定分片数,默认是搜索节点个数的两倍。
RANGE_TIME_PARTITION_STARTString表示创建索引操作前多少天开始创建分区。适用于有历史数据的场景,如果历史数据的时间戳比开始分区的时间还要小,则会报错。
说明 创建时间范围分区索引时必须指定此参数。
RANGE_TIME_PARTITION_INTERVALString表示间隔多少天创建新分区,例如RANGE_TIME_PARTITION_INTERVAL='7',表示每隔一周创建一个新分区。
说明 创建时间范围分区索引时必须指定此参数。
RANGE_TIME_PARTITION_TTLString表示保留多少天的分区数据,例如RANGE_TIME_PARTITION_TTL='180',表示保留半年的分区数据,历史分区数据会被自动清理掉。不指定时则表示不会被清理。
说明 该参数仅作用于创建时间范围分区索引。
RANGE_TIME_PARTITION_MAX_OVERLAPString如果写入的数据时间点是将来的时间,这个参数表示最多允许与当前时刻的时间间隔,单位为天。不指定时则表示无限制。
说明 该参数仅作用于创建时间范围分区索引。
RANGE_TIME_PARTITION_FIELD_TIMEUNITString表示业务指定的时间分区字段单位,默认单位为毫秒(ms)。
  • 分区字段单位设置为秒(s),数字长度为10位。
  • 分区字段单位设置为毫秒(ms),数字长度为13位。
说明 该参数仅作用于创建时间范围分区索引。

示例

  1. 创建SCHEMA和表。如果SCHEMA和表已存在,可以跳过该步骤。
    CREATE SCHEMA test;
    USE test;
    CREATE TABLE IF NOT EXISTS tbn (p1 varchar, p2 varchar, col1 bigint, col2 varchar, col3 varchar, col4 bigint, constraint primary key (p1, p2 desc));
  2. 根据不同场景创建搜索索引。
    • 通过指定索引列属性的方式,系统默认会执行同步构建搜索索引,对历史数据执行索引构建,执行过程所需的时间较长。
      CREATE SEARCH INDEX IF NOT EXISTS idx on tbn(col1, col2, col3);
    • 创建搜索索引时如果不需要执行同步构建搜索索引,可以在创建搜索索引语句后增加ASYNC。后续如果需要执行同步构建搜索索引,请参见步骤3
      CREATE SEARCH INDEX IF NOT EXISTS idx on tbn(col1, col2, col3) ASYNC;
    • 创建所有列的搜索索引,不指定具体列属性,均为默认值。注意:动态列不会被包含到索引中,参见使用动态列建索引。
      CREATE SEARCH INDEX IF NOT EXISTS idx on tbn("*");
    • 创建所有列的搜索索引,指定具体列属性。
      CREATE SEARCH INDEX IF NOT EXISTS idx on tbn("*",col1(type=text,analyzer=ik,indexed=true));
    • 指定所有列共同属性。如果索引列有col1,col2,col3,索引列的属性都为type=text,analyzer=ik,indexed=true。
      CREATE SEARCH INDEX IF NOT EXISTS idx on tbn("*"(type=text,analyzer=ik,indexed=true));
    • 指定列,不指定列属性。
      CREATE SEARCH INDEX IF NOT EXISTS idx on tbn(col1, col2, col3);
    • 指定列,并指定部分列属性,同时指定搜索索引状态。
      CREATE SEARCH INDEX IF NOT EXISTS idx on tbn(col1, col2(type=text,analyzer=ik), col3) WITH  (indexState=ACTIVE,numShards=4);
      说明 当设置column_options时,type和analyzer属性需要同时设置。
    • 指定列,创建时间分区索引。按时间列col4分区,从30天前开始,每7天自动分区,默认保留90天的分区数据。
      CREATE SEARCH INDEX idx ON tbn (col1, col2, col3, col4)
      partition by range time(col4) partitions 16
      with (indexState=ACTIVE, RANGE_TIME_PARTITION_START='30', RANGE_TIME_PARTITION_INTERVAL='7', RANGE_TIME_PARTITION_TTL='90', RANGE_TIME_PARTITION_MAX_OVERLAP='90');
  3. 如果使用ASYNC方式异步构建搜索索引,并且需要历史数据也被检索,请执行以下语句,默认同步构建搜索索引。执行后,可以在LTS页面左侧导航栏选择Lindorm Search > 全量同步,查看REBUILD进度,具体操作请参见购买并登录LTS
    ALTER SEARCH INDEX IF EXISTS idx ON tbn REBUILD;