使用 Tablestore Go SDK 将源字段映射为其他索引字段类型,无需修改数据表结构或重写数据。
前提条件
开始前,完成以下准备工作:
安装Tablestore Go SDK并初始化客户端。
数据表的最大版本数为 1。
数据表的数据生命周期为 -1,或已禁止通过 UpdateRow 更新数据。
注意事项
创建虚拟列时,数据表源字段和虚拟列必须符合以下类型转换规则。
|
数据表字段类型 |
虚拟列字段类型 |
|
String |
Keyword(含数组)、Text(含数组)、Long(含数组)、Double(含数组)、Date(含数组)、Geo-point(含数组) |
|
Long |
Keyword、Text、Date |
|
Double |
Keyword、Text |
虚拟列只能用于查询,不能通过 ColumnsToGet 返回字段值。需要获取字段值时,请返回虚拟列映射的源字段。
功能说明
虚拟列将数据表中的源字段映射为另一种多元索引字段类型。创建包含虚拟列的多元索引后,使用虚拟列名称查询数据。
创建虚拟列
fields := []*tablestore.FieldSchema{
{
FieldName: proto.String("price"),
FieldType: tablestore.FieldType_LONG,
Index: proto.Bool(true),
},
{
FieldName: proto.String("price_text"),
FieldType: tablestore.FieldType_KEYWORD,
Index: proto.Bool(true),
IsVirtualField: proto.Bool(true),
SourceFieldNames: []string{"price"},
},
}
_, err := client.CreateSearchIndex(&tablestore.CreateSearchIndexRequest{
TableName: "example_table",
IndexName: "example_index",
IndexSchema: &tablestore.IndexSchema{
FieldSchemas: fields,
},
})
if err != nil {
log.Fatal(err)
}
创建请求成功后,等待多元索引数据同步完成,再执行查询。
使用虚拟列查询数据
tableName := "example_table"
indexName := "example_index"
query := &search.TermQuery{FieldName: "price_text", Term: "1000"}
searchQuery := search.NewSearchQuery().
SetQuery(query).
SetLimit(10).
SetGetTotalCount(true)
response, err := client.Search(&tablestore.SearchRequest{
TableName: tableName,
IndexName: indexName,
SearchQuery: searchQuery,
ColumnsToGet: &tablestore.ColumnsToGet{
ReturnAllFromIndex: true,
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response.TotalCount)
fmt.Println(response.Rows)
参数说明
tablestore.FieldSchema 包含以下定义虚拟列所需的参数。其他索引字段参数请参见创建多元索引。
|
名称 |
类型 |
说明 |
|
FieldName(必选) |
*string |
虚拟列名称,不能与其他索引字段重名。 |
|
FieldType(必选) |
tablestore.FieldType |
虚拟列类型,必须符合支持的类型转换规则。 |
|
Index(必选) |
*bool |
设置为 true,为虚拟列建立索引。 |
|
IsVirtualField(必选) |
*bool |
设置为 true,表示该字段是虚拟列。 |
|
SourceFieldNames(必选) |
[]string |
源字段名称列表,当前仅支持一个源字段。 |
|
IsArray(可选) |
*bool |
虚拟列是否为数组,默认值为 false。 |
|
DateFormats(可选) |
[]string |
Date 类型虚拟列支持的日期格式列表。Date 类型必须配置。 |