Java SDK 可使用虚拟列将源字段映射为其他索引字段类型,无需修改数据表结构或重写数据。
前提条件
开始前,完成以下准备工作:
安装Tablestore Java SDK并初始化客户端。
数据表的最大版本数为 1。
数据表的数据生命周期为 -1,或者已禁止通过
UpdateRow更新数据。
注意事项
创建虚拟列时,源字段和虚拟列必须符合以下类型转换规则。
|
数据表字段类型 |
虚拟列字段类型 |
|
String |
Keyword(含数组)、FuzzyKeyword(含数组)、Text(含数组)、Long(含数组)、Double(含数组)、Date(含数组)、IP(含数组)、Geo-point(含数组) |
|
Long |
Keyword、FuzzyKeyword、Text、Date |
|
Double |
Keyword、FuzzyKeyword、Text |
虚拟列只能用于查询,不能通过 ColumnsToGet 返回字段值。需要获取字段值时,请返回虚拟列映射的源字段。
功能说明
虚拟列将数据表中的源字段映射为另一种索引字段类型。可以在创建多元索引时配置虚拟列,也可以通过动态修改 Schema 为已有多元索引添加虚拟列。配置完成后,使用虚拟列名称查询数据。
以下示例演示完整流程:先创建包含虚拟列的多元索引,再使用虚拟列查询数据。
创建虚拟列
以下示例将 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);
创建请求成功后,等待多元索引数据同步完成,再执行查询。
使用虚拟列查询数据
以下示例查询 price_as_keyword 虚拟列等于字符串 1000 的数据,并返回源数据表中的列。
String tableName = "example_table";
String indexName = "example_index";
TermsQuery query = new TermsQuery();
query.setFieldName("price_as_keyword");
query.addTerm(ColumnValue.fromString("1000"));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(query);
searchQuery.setGetTotalCount(true);
SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
columnsToGet.setReturnAll(true);
request.setColumnsToGet(columnsToGet);
SearchResponse response = client.search(request);
System.out.println(response.getTotalCount());
System.out.println(response.getRows());
参数说明
FieldSchema 包含以下定义虚拟列所需的参数。其他索引字段参数请参见创建多元索引。
|
名称 |
类型 |
说明 |
|
fieldName(必选) |
|
虚拟列名称,不能与索引中的其他字段重名。 |
|
fieldType(必选) |
|
虚拟列的索引字段类型,必须符合支持的类型转换规则。 |
|
isVirtualField(必选) |
|
设置为 |
|
sourceFieldNames(必选) |
|
虚拟列映射的源字段名称列表。当前仅支持一个源字段,通过 |