使用 CreateSearchIndex 接口在数据表上创建一个多元索引。一个数据表支持创建多个多元索引。创建多元索引时,您需要将要查询的字段添加到多元索引中,您还可以配置多元索引路由键、预排序等高级选项。
前提条件
已初始化 Client。具体操作,请参见初始化OTSClient。
已创建数据表,并且数据表的最大版本数(max Versions)必须为1,数据生命周期(Time to Live)必须满足如下条件中的任意一个。具体操作,请参见创建数据表。
数据表的数据生命周期为 -1(数据永不过期)。
数据表的数据生命周期不为 -1 时,数据表为禁止更新状态(即是否允许更新为否)。
已了解多元索引支持的字段类型,以及多元索引字段类型与数据表字段类型的映射关系。更多信息,请参见数据类型介绍。
注意事项
接口
public class CreateSearchIndexRequest implements Request {
/**数据表名称。*/
private String tableName;
/**多元索引名称。*/
private String indexName;
/**多元索引的 schema 结构。*/
private IndexSchema indexSchema;
/**
* 一般情况下,不需要设置本字段。
* 仅在动态修改多元索引 schema 的场景下,通过 setter 方法进行设置本字段,作为重建索引的源索引名字。
*/
private String sourceIndexName;
/**索引数据的 TTL 时间,单位为秒。在多元索引创建后,该配置项可通过调用 UpdateSearchIndex 接口动态更改。*/
private Integer timeToLive;
}
public class IndexSchema implements Jsonizable {
/**关于某个 index 的设置。*/
private IndexSetting indexSetting;
/**该 index 的所有字段的设置。*/
private List<FieldSchema> fieldSchemas;
/**自定义索引的预排序方式。*/
private Sort indexSort;
}
参数
创建多元索引时,需要指定数据表名称(tableName)、多元索引名称(indexName)和索引的结构信息(indexSchema),其中 indexSchema 包含 fieldSchemas(Index 所有字段的设置)、indexSetting(索引设置)和 indexSort(索引预排序设置)。详细参数说明请参见下表。
参数 | 说明 |
tableName | 数据表名称。 |
indexName | 多元索引名称。 |
fieldSchemas | 索引字段列表,每个 fieldSchema 包含如下内容:
|
indexSetting | 索引设置,包含 routingFields 设置。 routingFields(可选):自定义路由字段。可以选择部分主键列作为路由字段,在进行索引数据写入时,会根据路由字段的值计算索引数据的分布位置,路由字段的值相同的记录会被索引到相同的数据分区中。 |
indexSort | 索引预排序设置,包含 sorters 设置。如果不设置,则默认按照主键排序。 说明 含有 Nested 类型的索引不支持 indexSort,没有预排序。 sorters(可选):索引预排序方式的列表,支持按照主键排序和字段值排序。关于排序的更多信息,请参见排序和翻页。
|
sourceIndexName | 可选参数。一般情况下,不需要设置本字段。 仅在动态修改多元索引 schema 的场景下,通过 setter 方法设置本字段,作为重建索引的源索引名字。 |
timeToLive | 可选参数。数据生命周期(TTL),即数据的保存时间,单位为秒。 默认值为 -1,表示数据永不过期。数据生命周期的取值最低为 86400 秒(一天),也可设置为 -1(永不过期)。 当数据的保存时间超过设置的数据生命周期时,系统会自动清理超过数据生命周期的数据。 关于多元索引生命周期的使用方式,请参见生命周期管理。 |
示例
创建多元索引时使用默认配置
以下示例用于创建一个多元索引。该多元索引包含 Col_Keyword(KEYWORD 类型)、Col_Long(LONG 类型)和 Col_Vector(VECTOR 类型)三列,按照数据表主键进行预排序且数据永不过期。
private static void createSearchIndex(SyncClient client) {
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
//设置数据表名称。
request.setTableName("<TABLE_NAME>");
//设置多元索引名称。
request.setIndexName("<SEARCH_INDEX_NAME>");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
//设置字段名和类型。
new FieldSchema("Col_Keyword", FieldType.KEYWORD),
new FieldSchema("Col_Long", FieldType.LONG),
// 设置向量类型。
new FieldSchema("Col_Vector", FieldType.VECTOR).setIndex(true)
// 向量维度为 4,相似度算法为点积。
.setVectorOptions(new VectorOptions(VectorDataType.FLOAT_32, 4, VectorMetricType.DOT_PRODUCT))
));
request.setIndexSchema(indexSchema);
//调用 client 创建多元索引。
client.createSearchIndex(request);
}
创建多元索引时指定IndexSort
以下示例用于创建一个多元索引,该多元索引包含 Col_Keyword(KEYWORD 类型)、Col_Long(LONG 类型)、Col_Text(TEXT 类型)和 Timestamp(LONG 类型)四列,同时配置按照 Timestamp 列进行预排序。
private static void createSearchIndexWithIndexSort(SyncClient client) {
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
//设置数据表名称。
request.setTableName("<TABLE_NAME>");
//设置多元索引名称。
request.setIndexName("<SEARCH_INDEX_NAME>");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
new FieldSchema("Col_Keyword", FieldType.KEYWORD),
new FieldSchema("Col_Long", FieldType.LONG),
new FieldSchema("Col_Text", FieldType.TEXT),
new FieldSchema("Timestamp", FieldType.LONG)
.setEnableSortAndAgg(true)));
//设置按照 Timestamp 列进行预排序。
indexSchema.setIndexSort(new Sort(
Arrays.<Sort.Sorter>asList(new FieldSort("Timestamp", SortOrder.ASC))));
request.setIndexSchema(indexSchema);
//调用 client 创建多元索引。
client.createSearchIndex(request);
}
创建多元索引时设置生命周期
请确保数据表的更新状态为禁止。
以下示例用于创建一个多元索引,该多元索引包含 Col_Keyword(KEYWORD 类型)和 Col_Long(LONG 类型)两列,同时指定多元索引生命周期为 7 天。
// 请使用 5.12.0 及以上版本的 Java SDK。
public static void createIndexWithTTL(SyncClient client) {
int days = 7;
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
//设置数据表名称。
request.setTableName("<TABLE_NAME>");
//设置多元索引名称。
request.setIndexName("<SEARCH_INDEX_NAME>");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
//设置字段名和类型。
new FieldSchema("Col_Keyword", FieldType.KEYWORD),
new FieldSchema("Col_Long", FieldType.LONG)));
request.setIndexSchema(indexSchema);
//设置多元索引 TTL。
request.setTimeToLiveInDays(days);
//调用 client 创建多元索引。
client.createSearchIndex(request);
}
创建多元索引时指定虚拟列
以下示例用于创建一个多元索引,该多元索引包含 Col_Keyword(KEYWORD 类型)和 Col_Long(LONG 类型)两列,同时创建虚拟列 Col_Keyword_Virtual_Long(LONG 类型)和 Col_Long_Virtual_Keyword(KEYWORD 类型)。Col_Keyword_Virtual_Long 映射为数据表中 Col_Keyword 列,虚拟列 Col_Long_Virtual_Keyword 映射为数据表中 Col_Long 列。
private static void createSearchIndex(SyncClient client) {
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
//设置数据表名称。
request.setTableName("<TABLE_NAME>");
//设置多元索引名称。
request.setIndexName("<SEARCH_INDEX_NAME>");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
//设置字段名和类型。
new FieldSchema("Col_Keyword", FieldType.KEYWORD),
//设置字段名和类型。
new FieldSchema("Col_Keyword_Virtual_Long", FieldType.LONG)
//设置字段是否为虚拟列。
.setVirtualField(true)
//虚拟列对应的数据表中字段。
.setSourceFieldName("Col_Keyword"),
new FieldSchema("Col_Long", FieldType.LONG),
new FieldSchema("Col_Long_Virtual_Keyword", FieldType.KEYWORD)
.setVirtualField(true)
.setSourceFieldName("Col_Long")));
request.setIndexSchema(indexSchema);
//调用 client 创建多元索引。
client.createSearchIndex(request);
}
创建多元索引时开启查询高亮
以下示例用于创建一个多元索引,该多元索引包含Col_Keyword(KEYWORD 类型)、Col_Long(LONG 类型)和 Col_Text(TEXT 类型)三列,同时为 Col_Text 列开启查询高亮功能。
private static void createSearchIndexwithHighlighting(SyncClient client) {
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
//设置数据表名称。
request.setTableName("<TABLE_NAME>");
//设置多元索引名称。
request.setIndexName("<SEARCH_INDEX_NAME>");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
//设置字段名和类型。
new FieldSchema("Col_Keyword", FieldType.KEYWORD),
new FieldSchema("Col_Long", FieldType.LONG),
//为字段开启查询高亮功能。
new FieldSchema("Col_Text", FieldType.TEXT).setIndex(true).setEnableHighlighting(true)
));
request.setIndexSchema(indexSchema);
//调用 client 创建多元索引。
client.createSearchIndex(request);
}
常见问题
相关文档
创建多元索引后,您可以选择合适的查询类型进行多维度数据查询。多元索引查询类型包括精确查询、多词精确查询、全匹配查询、匹配查询、短语匹配查询、前缀查询、后缀查询、范围查询、通配符查询、地理位置查询、多条件组合查询、向量检索、嵌套类型查询和列存在性查询。
当通过 Search 接口查询数据时,您可以对结果集进行过滤。
创建多元索引后,您可以按需管理多元索引。
如果要在多元索引中新增、更新或者删除索引列,您可以使用动态修改 schema 功能实现。具体操作,请参见动态修改 schema。
如果希望清理多元索引中的历史数据或者希望延长数据保存时间,您可以修改多元索引的数据生命周期。具体操作,请参见生命周期管理。
如果要获取某个数据表关联的所有多元索引列表信息,您可以使用列出多元索引列表功能实现。具体操作,请参见列出多元索引列表。
如果要查询多元索引的描述信息,包括多元索引的字段信息和索引配置等,您可以使用查询多元索引描述信息功能实现。具体操作,请参见查询多元索引描述信息。
如果不再需要使用多元索引,您可以删除多元索引。具体操作,请参见删除多元索引。
如果要进行数据分析,例如求最值、求和、统计行数等,您可以使用Search接口的统计聚合功能或者 SQL 查询功能来实现。具体操作,请参见统计聚合和SQL 查询。
如果要快速导出数据,而不关心整个结果集的顺序时,您可以使用 ParallelScan 接口和 ComputeSplits 接口实现多并发导出数据。具体操作,请参见并发导出数据。