您可以使用CreateSearchIndex接口为主表创建一个多元索引(SearchIndex)。一张主表上可以创建多个多元索引,在创建多元索引时可以指定索引名和索引结构。

参数说明

  • TableName:要创建的多元索引所属的主表名。
  • IndexName:要创建的多元索引的名字。
  • IndexSchema:定义索引结构和一些配置。
    • IndexSetting:RoutingFields(高级功能,可选配置):自定义路由字段。可以选择部分主键列作为路由字段,在进行索引数据写入时,会根据路由字段的值计算索引数据的分布位置,路由字段的值相同的记录会被索引到相同的数据分区中。
    • IndexSort(可选):索引的预排序方式,可以指定主键排序或者列排序。如果不设置,默认按照主键进行预排序。
    • FieldSchemas:FieldSchema的列表,每个FieldSchema包含以下内容:
      参数 是否必须 说明
      FieldName
      • String类型。
      • 要索引的字段名,即列名。
      • 可以是主键列,也可以是属性列。
      FieldType 字段类型,详见多元索引的接口说明文档。
      Index
      • bool值。
      • 是否开启索引。
      IndexOptions 索引的配置选项。
      Analyzer 分词器设置。
      EnableSortAndAgg
      • bool值。
      • 是否开启排序与统计功能。
      Store
      • bool值。
      • 是否在多元索引中附加存储该字段的值。
      • 开启后,可以直接从多元索引中读取该字段的值,而不必反查主表,可用于查询性能优化。
      Array
      • bool值。
      • 是否是数组格式。
      • 如果为true,则表示该列是一个数组,在写入时,也必须按照JSON数组格式写入,比如["a","b","c"]。NESTED类型本身就是一个数组,所以无须设置Array。

示例

/**
 *创建一个多元索引,包含Col_Keyword和Col_Long两列,类型分别设置为字符串(KEYWORD)和整型(LONG)。
 */
func CreateSearchIndex(client *tablestore.TableStoreClient, tableName string, indexName string) {
	request := &tablestore.CreateSearchIndexRequest{}
	request.TableName = tableName // 设置表名
	request.IndexName = indexName // 设置索引名

	schemas := []*tablestore.FieldSchema{}
	field1 := &tablestore.FieldSchema{
		FieldName: proto.String("Col_Keyword"), // 设置字段名,使用proto.String用于获取字符串指针
		FieldType: tablestore.FieldType_KEYWORD, // 设置字段类型
		Index:     proto.Bool(true), // 设置开启索引
		EnableSortAndAgg: proto.Bool(true), // 设置开启排序与统计功能
	}
	field2 := &tablestore.FieldSchema{
		FieldName: proto.String("Col_Long"),
		FieldType: tablestore.FieldType_LONG,
		Index:     proto.Bool(true),
		EnableSortAndAgg: proto.Bool(true),
	}
	schemas = append(schemas, field1, field2)

	request.IndexSchema = &tablestore.IndexSchema{
		FieldSchemas: schemas, // 设置SearchIndex包含的字段
	}
	resp, err := client.CreateSearchIndex(request) // 调用client创建SearchIndex
	if err != nil {
		fmt.Println("error :", err)
		return
	}
	fmt.Println("CreateSearchIndex finished, requestId:", resp.ResponseInfo.RequestId)
}