创建多元索引

更新时间:
复制 MD 格式

使用 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(必选)

String

数据表名称。

indexName(必选)

String

多元索引名称。

indexSchema(必选)

IndexSchema

索引结构。

sourceIndexName(可选)

String

重建索引时使用的源索引名称。仅动态修改多元索引 Schema 时设置。

timeToLive(可选)

Integer

索引数据的生命周期,单位为秒,默认值为 -1。取值为 -1 或不小于 86400 的整数;-1 表示数据永不过期。数据保留时间超过该值后,系统自动清理过期数据。

设置非 -1 值时,必须禁止通过 UpdateRow 更新数据,且索引生命周期不能超过数据表生命周期。创建后可以通过 updateSearchIndex 修改该值,也可以通过 setTimeToLiveInDays 按天设置。更多信息,请参见生命周期管理

索引结构

indexSchema 的类型为 IndexSchema,包含以下参数。

名称

类型

说明

fieldSchemas(必选)

List<FieldSchema>

索引字段列表。

indexSetting(可选)

IndexSetting

索引设置。

indexSort(可选)

Sort

索引预排序配置。不设置且索引不包含 Nested 字段时,系统默认按主键排序。Nested 索引不支持预排序。

索引字段

indexSchema.fieldSchemas[] 中每个元素的类型为 FieldSchema,包含以下参数。

名称

类型

说明

fieldName(必选)

String

索引字段名称,可以对应主键列或属性列。

fieldType(必选)

FieldType

索引字段的数据类型。多层逻辑关系使用 Nested 类型,JSON 格式数据可以使用 JSON 类型,也可以按字符串写入后结合数组或 Nested 类型查询;地理位置数据使用 Geo-point 类型。

index(可选)

boolean

是否为字段建立倒排索引或空间索引,默认值为 true。设置为 false 时不为该字段建立索引。

enableHighlighting(可选)

boolean

是否启用摘要与高亮。仅 Text 字段支持,默认值为 false

analyzer(可选)

String

Text 字段使用的分词器。不设置时使用单字分词。

analyzerParameter(可选)

AnalyzerParameter

分词器参数。设置 analyzer 时必须按分词器类型配置对应参数。

enableSortAndAgg(可选)

boolean

是否启用排序与统计聚合,默认值为 true。Text 字段不支持排序与统计聚合;如需对 Text 字段进行排序或聚合,可以创建 Keyword 类型的虚拟列

isArray(可选)

boolean

字段是否为数组。数组值必须以 JSON 数组格式写入,Nested 字段无需设置。

subFieldSchemas(可选)

List<FieldSchema>

Nested 字段的子字段列表。Nested 字段必须配置。

isVirtualField(可选)

boolean

字段是否为虚拟列,默认值为 false

sourceFieldNames(可选)

List<String>

虚拟列映射的数据表字段列表。设置虚拟列时必须配置。

dateFormats(可选)

List<String>

Date 字段支持的日期格式列表。Date 字段必须配置。

vectorOptions(可选)

VectorOptions

Vector 字段的向量配置,包括数据类型、维度和距离度量算法。Vector 字段必须配置。

jsonType(可选)

JsonType

JSON 字段的索引类型,取值为 OBJECTNESTED。JSON 字段必须配置。

向量配置

indexSchema.fieldSchemas[].vectorOptions 的类型为 VectorOptions,包含以下参数。

名称

类型

说明

dataType(必选)

VectorDataType

向量数据类型,当前仅支持 FLOAT_32

dimension(必选)

Integer

向量维度,最大值为 4096。

metricType(必选)

VectorMetricType

距离度量算法,取值为 EUCLIDEANCOSINEDOT_PRODUCT,评分越高表示向量越相似。

EUCLIDEAN 计算多维空间中的直线距离,Tablestore 不执行最后的平方根计算;COSINE 计算向量夹角的余弦值,常用于文本相似度;DOT_PRODUCT 将相同维度向量的对应坐标相乘后求和。更多信息,请参见距离度量算法

索引设置

indexSchema.indexSetting 的类型为 IndexSetting,包含以下参数。

名称

类型

说明

routingFields(可选)

List<String>

自定义路由字段。可以指定一个或多个主键列,通常设置一个。设置多个路由字段时,系统将字段值拼接为一个值。系统根据路由字段值计算索引数据的分布位置,值相同的记录写入同一数据分区。

预排序配置

indexSchema.indexSort 的类型为 Sort,包含以下参数。

名称

类型

说明

sorters(可选)

List<Sort.Sorter>

预排序方式列表。PrimaryKeySort 按主键排序,FieldSort 按字段值排序。用于 FieldSort 的字段必须已建立索引并开启排序与统计聚合。更多信息,请参见排序和翻页

主键排序

indexSchema.indexSort.sorters[] 中类型为 PrimaryKeySort 的元素用于按主键预排序,包含以下参数。

名称

类型

说明

order(可选)

SortOrder

主键排序顺序,取值为 SortOrder.ASCSortOrder.DESC,默认值为 SortOrder.ASC

字段值排序

indexSchema.indexSort.sorters[] 中类型为 FieldSort 的元素用于按字段值预排序,包含以下参数。

名称

类型

说明

fieldName(必选)

String

用于预排序的字段名称。

order(可选)

SortOrder

字段值排序顺序,取值为 SortOrder.ASCSortOrder.DESC,默认值为 SortOrder.ASC

mode(可选)

SortMode

字段存在多个值时使用的排序方式。

场景示例

设置索引预排序

以下示例按 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);