使用 Java SDK 为数据表创建多元索引,并配置索引字段、预排序、生命周期、虚拟列及摘要与高亮。
前提条件
开始前,完成以下准备工作:
-
安装Tablestore Java SDK并初始化客户端。
-
已创建数据表,并将最大版本数设置为 1。
-
数据表的数据生命周期为 -1,或者已禁止通过
UpdateRow更新数据。
功能说明
调用 createSearchIndex 方法为指定数据表创建多元索引。同一数据表可以创建多个多元索引。请求中需要指定数据表、索引名称和完整的索引 Schema,并将需要查询的列添加到 fieldSchemas。索引字段的数据类型必须与数据表中对应列的数据类型匹配,支持的类型请参见数据类型。
public CreateSearchIndexResponse createSearchIndex(CreateSearchIndexRequest request)
创建多元索引是异步操作。请求成功后,查询索引信息并等待索引状态变为 RUNNING,再使用索引查询数据。
以下示例为 example_table 创建包含 Keyword 和 Long 字段的 example_index。未设置预排序和生命周期时,索引默认按主键排序,数据永不过期。
String tableName = "example_table";
String indexName = "example_index";
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
new FieldSchema("category", FieldType.KEYWORD),
new FieldSchema("price", FieldType.LONG)));
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
request.setTableName(tableName);
request.setIndexName(indexName);
request.setIndexSchema(indexSchema);
client.createSearchIndex(request);
参数说明
CreateSearchIndexRequest 包含以下参数:
|
名称 |
类型 |
说明 |
|
tableName(必选) |
|
数据表名称。 |
|
indexName(必选) |
|
多元索引名称。 |
|
indexSchema(必选) |
|
索引结构。 |
|
sourceIndexName(可选) |
|
重建索引时使用的源索引名称。仅动态修改多元索引 Schema 时设置。 |
|
timeToLive(可选) |
|
索引数据的生命周期,单位为秒,默认值为 -1。取值为 -1 或不小于 86400 的整数;-1 表示数据永不过期。数据保留时间超过该值后,系统自动清理过期数据。 设置非 -1 值时,必须禁止通过 |
索引结构
indexSchema 的类型为 IndexSchema,包含以下参数。
|
名称 |
类型 |
说明 |
|
fieldSchemas(必选) |
|
索引字段列表。 |
|
indexSetting(可选) |
|
索引设置。 |
|
indexSort(可选) |
|
索引预排序配置。不设置且索引不包含 Nested 字段时,系统默认按主键排序。Nested 索引不支持预排序。 |
索引字段
indexSchema.fieldSchemas[] 中每个元素的类型为 FieldSchema,包含以下参数。
|
名称 |
类型 |
说明 |
|
fieldName(必选) |
|
索引字段名称,可以对应主键列或属性列。 |
|
fieldType(必选) |
|
索引字段的数据类型。多层逻辑关系使用 Nested 类型,JSON 格式数据可以使用 JSON 类型,也可以按字符串写入后结合数组或 Nested 类型查询;地理位置数据使用 Geo-point 类型。 |
|
index(可选) |
|
是否为字段建立倒排索引或空间索引,默认值为 |
|
enableHighlighting(可选) |
|
是否启用摘要与高亮。仅 Text 字段支持,默认值为 |
|
analyzer(可选) |
|
Text 字段使用的分词器。不设置时使用单字分词。 |
|
analyzerParameter(可选) |
|
分词器参数。设置 |
|
enableSortAndAgg(可选) |
|
是否启用排序与统计聚合,默认值为 |
|
isArray(可选) |
|
字段是否为数组。数组值必须以 JSON 数组格式写入,Nested 字段无需设置。 |
|
subFieldSchemas(可选) |
|
Nested 字段的子字段列表。Nested 字段必须配置。 |
|
isVirtualField(可选) |
|
字段是否为虚拟列,默认值为 |
|
sourceFieldNames(可选) |
|
虚拟列映射的数据表字段列表。设置虚拟列时必须配置。 |
|
dateFormats(可选) |
|
Date 字段支持的日期格式列表。Date 字段必须配置。 |
|
vectorOptions(可选) |
|
Vector 字段的向量配置,包括数据类型、维度和距离度量算法。Vector 字段必须配置。 |
|
jsonType(可选) |
|
JSON 字段的索引类型,取值为 |
向量配置
indexSchema.fieldSchemas[].vectorOptions 的类型为 VectorOptions,包含以下参数。
|
名称 |
类型 |
说明 |
|
dataType(必选) |
|
向量数据类型,当前仅支持 |
|
dimension(必选) |
|
向量维度,最大值为 4096。 |
|
metricType(必选) |
|
距离度量算法,取值为
|
索引设置
indexSchema.indexSetting 的类型为 IndexSetting,包含以下参数。
|
名称 |
类型 |
说明 |
|
routingFields(可选) |
|
自定义路由字段。可以指定一个或多个主键列,通常设置一个。设置多个路由字段时,系统将字段值拼接为一个值。系统根据路由字段值计算索引数据的分布位置,值相同的记录写入同一数据分区。 |
预排序配置
indexSchema.indexSort 的类型为 Sort,包含以下参数。
|
名称 |
类型 |
说明 |
|
sorters(可选) |
|
预排序方式列表。 |
主键排序
indexSchema.indexSort.sorters[] 中类型为 PrimaryKeySort 的元素用于按主键预排序,包含以下参数。
|
名称 |
类型 |
说明 |
|
order(可选) |
|
主键排序顺序,取值为 |
字段值排序
indexSchema.indexSort.sorters[] 中类型为 FieldSort 的元素用于按字段值预排序,包含以下参数。
|
名称 |
类型 |
说明 |
|
fieldName(必选) |
|
用于预排序的字段名称。 |
|
order(可选) |
|
字段值排序顺序,取值为 |
|
mode(可选) |
|
字段存在多个值时使用的排序方式。 |
场景示例
设置索引预排序
以下示例按 created_at 字段升序预排序索引数据。
String tableName = "example_table";
String indexName = "example_index";
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
new FieldSchema("category", FieldType.KEYWORD),
new FieldSchema("price", FieldType.LONG),
new FieldSchema("description", FieldType.TEXT),
new FieldSchema("created_at", FieldType.LONG)
.setEnableSortAndAgg(true)));
indexSchema.setIndexSort(new Sort(
Collections.<Sort.Sorter>singletonList(
new FieldSort("created_at", SortOrder.ASC))));
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
request.setTableName(tableName);
request.setIndexName(indexName);
request.setIndexSchema(indexSchema);
client.createSearchIndex(request);
设置索引生命周期
以下示例将索引生命周期设置为 7 天。请使用 5.12.0 及以上版本的 Java SDK。
String tableName = "example_table";
String indexName = "example_index";
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
new FieldSchema("category", FieldType.KEYWORD),
new FieldSchema("price", FieldType.LONG)));
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
request.setTableName(tableName);
request.setIndexName(indexName);
request.setIndexSchema(indexSchema);
request.setTimeToLiveInDays(7);
client.createSearchIndex(request);
创建虚拟列
以下示例将 Keyword 字段 category 映射为 Long 虚拟列,并将 Long 字段 price 映射为 Keyword 虚拟列。
String tableName = "example_table";
String indexName = "example_index";
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
new FieldSchema("category", FieldType.KEYWORD),
new FieldSchema("category_as_long", FieldType.LONG)
.setVirtualField(true)
.setSourceFieldName("category"),
new FieldSchema("price", FieldType.LONG),
new FieldSchema("price_as_keyword", FieldType.KEYWORD)
.setVirtualField(true)
.setSourceFieldName("price")));
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
request.setTableName(tableName);
request.setIndexName(indexName);
request.setIndexSchema(indexSchema);
client.createSearchIndex(request);
启用摘要与高亮
以下示例为 Text 字段 description 启用摘要与高亮。
String tableName = "example_table";
String indexName = "example_index";
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
new FieldSchema("category", FieldType.KEYWORD),
new FieldSchema("price", FieldType.LONG),
new FieldSchema("description", FieldType.TEXT)
.setEnableHighlighting(true)));
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
request.setTableName(tableName);
request.setIndexName(indexName);
request.setIndexSchema(indexSchema);
client.createSearchIndex(request);