使用CreateSearchIndex接口在数据表上创建一个多元索引。一个数据表支持创建多个多元索引。创建多元索引时,您需要将要查询的字段添加到多元索引中,您还可以配置多元索引路由键、预排序等高级选项。
前提条件
已初始化Client。具体操作,请参见初始化OTSClient。
已创建数据表,并且数据表的最大版本数(max Versions)必须为1,数据生命周期(Time to Live)必须满足如下条件中的任意一个。具体操作,请参见创建数据表。
数据表的数据生命周期为-1(数据永不过期)。
数据表的数据生命周期不为-1时,数据表为禁止更新状态(即是否允许更新为否)。
注意事项
创建多元索引时,多元索引中字段的数据类型必须与数据表中字段的数据类型相匹配。更多信息,请参见基础数据类型及映射。
如果要修改多元索引为指定数据生命周期(即取值不为-1),则您必须禁用数据表的UpdateRow更新写入功能。同时多元索引的TTL值必须小于或等于数据表的TTL值。更多信息,请参见生命周期管理。
接口
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)和timeToLive(数据生命周期),其中indexSchema包含fieldSchemas(Index的所有字段的设置)、indexSetting(索引设置)和indexSort(索引预排序设置)。详细参数说明请参见下表。
参数 | 说明 |
tableName | 数据表名称。 |
indexName | 多元索引名称。 |
fieldSchemas | fieldSchema的列表,每个fieldSchema包含如下内容:
|
indexSetting | 索引设置,包含routingFields设置。 routingFields(可选):自定义路由字段。可以选择部分主键列作为路由字段,在进行索引数据写入时,会根据路由字段的值计算索引数据的分布位置,路由字段的值相同的记录会被索引到相同的数据分区中。 |
indexSort | 索引预排序设置,包含sorters设置。如果不设置,则默认按照主键排序。 说明 含有Nested类型的索引不支持indexSort,没有预排序。 sorters(可选):索引的预排序方式,支持按照主键排序和字段值排序。关于排序的更多信息,请参见排序和翻页。
|
timeToLive | 可选参数,默认值为-1。数据生命周期(TTL),即数据的保存时间。 当数据的保存时间超过设置的数据生命周期时,系统会自动清理超过数据生命周期的数据。 数据生命周期至少为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 createRequest = new CreateSearchIndexRequest();
//设置数据表名称。
createRequest.setTableName("<TABLE_NAME>");
//设置多元索引名称。
createRequest.setIndexName("<SEARCH_INDEX_NAME>");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
//设置字段名和类型。
new FieldSchema("Col_Keyword", FieldType.KEYWORD),
new FieldSchema("Col_Long", FieldType.LONG)));
createRequest.setIndexSchema(indexSchema);
//设置多元索引TTL。
createRequest.setTimeToLiveInDays(days);
//调用client创建多元索引。
client.createSearchIndex(createRequest);
}
创建多元索引时指定虚拟列
以下示例用于创建一个多元索引,多元索引包含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接口查询数据时,如果要对结果集进行排序或者翻页,您可以使用排序和翻页功能来实现。具体操作,请参见排序和翻页。
当通过Search接口查询数据时,如果要在返回结果对关键词进行高亮显示,您可以使用查询高亮功能来实现。具体操作,请参见查询高亮。
当通过Search接口查询数据时,如果要按照某一列对结果集做折叠,使对应类型的数据在结果展示中只出现一次,您可以使用折叠(去重)功能来实现。具体操作,请参见折叠(去重)。
如果希望清理多元索引中的历史数据或者希望延长数据保存时间,您可以修改多元索引的数据生命周期。具体操作,请参见生命周期管理。
如果要进行数据分析,例如求最值、求和、统计行数等,您可以使用Search接口的统计聚合功能或者SQL查询来实现。具体操作,请参见统计聚合和SQL查询。
如果要快速导出数据,而不关心整个结果集的顺序时,您可以使用ParallelScan接口和ComputeSplits接口实现多并发导出数据。具体操作,请参见并发导出数据。
如果要在多元索引中新增、更新或者删除索引列,您可以使用动态修改schema功能实现。具体操作,请参见动态修改schema。
如果要获取某个数据表关联的所有多元索引的列表信息,您可以使用列出多元索引列表功能实现。具体操作,请参见列出多元索引列表。
如果要查询多元索引的描述信息,包括多元索引的字段信息和索引配置等,您可以使用查询多元索引描述信息功能实现。具体操作,请参见查询多元索引描述信息。
如果不再需要使用多元索引,您可以删除多元索引。具体操作,请参见删除多元索引。