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

参数说明

  • TableName:需要创建多元索引的表名。
  • IndexName:多元索引的名字。
  • IndexSchema:包含IndexSetting(索引设置)和FieldSchemas(Index的所有字段的设置)。
    • IndexSetting

      RoutingFields(高级功能,可选配置):自定义路由字段。可以选择部分主键列作为路由字段,在进行索引数据写入时,会根据路由字段的值来计算索引数据的分布位置。路由字段值相同的记录会被索引到相同的数据分区中。

    • FieldSchemas
      参数 是否必需 说明
      FieldName
      • String类型。
      • 要索引的字段名,即列名。
      • 可以是主键列,也可以是属性列。
      FieldType 枚举类型,支持:
      • LONG(长整型)
      • DOUBLE(浮点数)
      • BOOLEAN(布尔)
      • KEYWORD(字符串)
      • TEXT(分词字符串)
      • GEO_POINT(地理点)
      • NESTED(嵌套类型)
      Index 是否开启索引。
      IndexOptions 索引的配置选项。
      Analyzer 分词器设置。
      EnableSortAndAgg
      • Bool类型。
      • 是否开启排序与统计功能。
      Store
      • Bool类型。
      • 是否在多元索引中附加存储该字段的值。
      • 开启后,可以直接从多元索引中读取该字段的值,而不必反查主表,可用于查询性能优化。
      Array
      • Bool类型。
      • 是否是数组格式。
      • 如果为true,则表示该列是一个数组,在写入时,也必须按照JSON数组格式写入,例如["a","b","c"]。Nested类型本身就是一个数组,所以无须设置Array。
    • IndexSort(可选):索引的预排序方式,可以指定主键排序或者列排序。如果不设置,默认按照主键进行预排序。

示例

示例1

创建一个多元索引,包含Col_KeywordCol_Long两列,类型分别设置为字符串()和整型(LONG)。



private static void createSearchIndex(SyncClient client) {
    CreateSearchIndexRequest request = new CreateSearchIndexRequest();
    request.setTableName(TABLE_NAME); // 设置表名
    request.setIndexName(INDEX_NAME); // 设置索引名
    IndexSchema indexSchema = new IndexSchema();
    indexSchema.setFieldSchemas(Arrays.asList(
            new FieldSchema("Col_Keyword", FieldType.KEYWORD) // 设置字段名、类型
                    .setIndex(true) // 设置开启索引
                    .setEnableSortAndAgg(true), // 设置开启排序和统计功能
            new FieldSchema("Col_Long", FieldType.LONG)
                    .setIndex(true)
                    .setEnableSortAndAgg(true)));
    request.setIndexSchema(indexSchema);
    client.createSearchIndex(request); // 调用client创建SearchIndex
}

示例2

指定IndexSort。

private static void createSearchIndexWithIndexSort(SyncClient client) {
    CreateSearchIndexRequest request = new CreateSearchIndexRequest();
    request.setTableName(TABLE_NAME);
    request.setIndexName(INDEX_NAME);
    IndexSchema indexSchema = new IndexSchema();
    indexSchema.setFieldSchemas(Arrays.asList(
            new FieldSchema("Col_Keyword", FieldType.KEYWORD).setIndex(true).setEnableSortAndAgg(true),
            new FieldSchema("Col_Long", FieldType.LONG).setIndex(true).setEnableSortAndAgg(true),
            new FieldSchema("Col_Text", FieldType.TEXT).setIndex(true),
            new FieldSchema("Timestamp", FieldType.LONG).setIndex(true).setEnableSortAndAgg(true)));
    // 设置按照Timestamp这一列进行预排序, Timestamp这一列必须建立索引,并打开EnableSortAndAgg
    indexSchema.setIndexSort(new Sort(
            Arrays.<Sort.Sorter>asList(new FieldSort("Timestamp", SortOrder.ASC))));
    request.setIndexSchema(indexSchema);
    client.createSearchIndex(request);
}