在数据表上创建一个多元索引后,您可以根据多元索引中建立索引的字段来查询数据表中的数据。一张数据表可以创建多个多元索引。

最佳使用方式

请根据实际查询需求确定在一张数据表中创建多元索引的个数。

例如有一张数据表有5个字段,分别为id、name、age、city、sex,需要按照name、age或city查询数据时,有两种创建多元索引的方式。

  • 方法一:一个字段建立一个多元索引
    按照name、age或city字段分别创建多元索引,名称分别为name_index、age_index、city_index。
    • 如果按照城市查询学生,则查询city_index,如果按照年龄查询学生,则查询age_index。
    • 如果查询年龄小于12岁且城市是成都的学生,此种方式就无法查询。

    此方式的实现类似于全局二级索引,使用此方式创建多元索引会带来更高的费用,因此不建议使用此方式创建多元索引。

  • 方法二:多个字段创建在一个多元索引中
    将name、age和city字段创建在一个多元索引中,名称为student_index。
    • 如果按照城市查询学生,则查询student_index中city字段;如果按照年龄查询学生,则查询student_index中age字段。
    • 如果查询年龄小于12岁且城市是成都的学生,则查询student_index中age和city字段。

    此方式才能发挥多元索引最大优势,不仅功能更丰富,而且价格会更低。极力推荐使用此方式创建多元索引。

限制

  • 创建索引的时效性

    创建多元索引后,需要等几秒钟才能使用,但是此过程中不影响数据写入,只影响索引元信息的查询和索引查询。

  • 数量限制

    更多信息,请参见多元索引限制

接口

创建多元索引的接口为CreateSearchIndex。

使用

参数

创建多元索引时,需要指定数据表名称(tableName)、多元索引名称(indexName)和索引的结构信息(indexSchema),其中indexSchema包含fieldSchemas(Index的所有字段的设置)、indexSetting(索引设置)和indexSort(索引预排序设置)。详细参数说明请参见下表。
参数 说明
tableName 数据表名称。
indexName 多元索引名称。
fieldSchemas fieldSchema的列表,每个fieldSchema包含如下内容:
  • fieldName(必选):创建多元索引的字段名,即列名,类型为String。

    多元索引中的字段可以是主键列或者属性列。

  • fieldType(必选):字段类型,类型为FieldType.XXX。更多信息,请参见数据类型映射
  • array(可选):是否为数组,类型为Boolean。

    如果设置为true,则表示该列是一个数组,在写入时,必须按照JSON数组格式写入,例如["a","b","c"]。

    由于Nested类型是一个数组,当fieldType为Nested类型时,无需设置此参数。

  • analyzer(可选):分词器类型。当字段类型为Text时,可以设置此参数;如果不设置此参数,则默认分词器类型为单字分词。关于分词的更多信息,请参见分词
  • isVirtualField(可选):该字段是否为虚拟列,类型为Boolean类型,默认值为false。只有使用虚拟列时,才需要设置此参数。关于虚拟列的更多信息,请参见虚拟列
  • sourceFieldName(可选):数据表中的字段名称,类型为String。当设置isVirtualField为true时,必须设置此参数。
  • dateFormats(可选):日期的格式,类型为String。当字段类型为Date时,必须设置此参数。更多信息,请参见日期数据类型
indexSetting 索引设置,包含routingFields设置。

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

indexSort 索引预排序设置,包含sorters设置。如果不设置,则默认按照主键排序。
说明 含有Nested类型的索引不支持indexSort,没有预排序。
sorters(可选):索引的预排序方式,支持按照主键排序和字段值排序。更多信息,请参见排序和翻页
  • PrimaryKeySort表示按照主键排序,包含如下设置:

    order:排序的顺序,可按升序或者降序排序,默认为升序(SortOrder.ASC)。

  • FieldSort表示按照字段值排序, 包含如下设置:

    只有建立索引且开启排序与统计聚合功能的字段才能进行预排序。

    • fieldName:排序的字段名。
    • order:排序的顺序,可按照升序或者降序排序,默认为升序(SortOrder.ASC)。
    • mode:当字段存在多个值时的排序方式。
timeToLive 可选参数,默认值为-1。数据生命周期(TTL),即数据的保存时间。

当数据的保存时间超过设置的数据生命周期时,系统会自动清理超过数据生命周期的数据。

数据生命周期至少为86400秒(一天)或-1(数据永不过期)。

多元索引生命周期的使用方式,请参见多元索引生命周期

示例

  • 创建多元索引。
    创建一个多元索引,包含Col_Keyword和Col_Long两列,类型分别设置为字符串(String)和整型(Long)。
    private static void createSearchIndex(SyncClient client) {
        CreateSearchIndexRequest request = new CreateSearchIndexRequest();
        request.setTableName(tableName); //设置数据表名称。
        request.setIndexName(indexName); //设置多元索引名称。
        IndexSchema indexSchema = new IndexSchema();
        indexSchema.setFieldSchemas(Arrays.asList(
                new FieldSchema("Col_Keyword", FieldType.KEYWORD), //设置字段名和类型。
                new FieldSchema("Col_Long", FieldType.LONG)));
        request.setIndexSchema(indexSchema);
        client.createSearchIndex(request); //调用client创建多元索引。
    }
  • 创建多元索引时指定IndexSort。
    private static void createSearchIndexWithIndexSort(SyncClient client) {
        CreateSearchIndexRequest request = new CreateSearchIndexRequest();
        request.setTableName(tableName); //设置数据表名称。
        request.setIndexName(indexName); //设置多元索引名称。
        IndexSchema indexSchema = new IndexSchema();
        indexSchema.setFieldSchemas(Arrays.asList(
                new FieldSchema("Col_Keyword", FieldType.KEYWORD),
                new FieldSchema("Col_Long", FieldType.LONG),
                new FieldSchema("Col_Text", FieldType.TEXT),
                new FieldSchema("Timestamp", FieldType.LONG)));
        //设置按照Timestamp列进行预排序。
        indexSchema.setIndexSort(new Sort(
                Arrays.<Sort.Sorter>asList(new FieldSort("Timestamp", SortOrder.ASC))));
        request.setIndexSchema(indexSchema);
        client.createSearchIndex(request);
    }
  • 创建多元索引时设置生命周期。
    注意 请确保数据表的更新状态为禁止。
    // 请使用5.12.0及以上版本的Java SDK。
    public void createIndexWithTTL(SyncClient client) {
        int days = 7;
        CreateSearchIndexRequest createRequest = new CreateSearchIndexRequest();
        createRequest.setTableName(tableName);
        createRequest.setIndexName(indexName);
        createRequest.setIndexSchema(indexSchema);
        // 设置多元索引TTL。
        createRequest.setTimeToLiveInDays(days);
        client.createSearchIndex(createRequest);
    }
  • 创建多元索引时指定虚拟列。
    创建一个多元索引,多元索引包含Col_Keyword和Col_Long两列,同时创建虚拟列Col_Keyword_Virtual_Long和Col_Long_Virtual_Keyword。Col_Keyword_Virtual_Long映射为数据表中Col_Keyword列,虚拟列Col_Long_Virtual_Keyword映射为数据表中Col_Long列。
    private static void createSearchIndex(SyncClient client) {
        CreateSearchIndexRequest request = new CreateSearchIndexRequest();
        request.setTableName(tableName); //设置数据表名称。
        request.setIndexName(indexName); //设置多元索引名称。
        IndexSchema indexSchema = new IndexSchema();
        indexSchema.setFieldSchemas(Arrays.asList(
            new FieldSchema("Col_Keyword", FieldType.KEYWORD), //设置字段名和类型。
            new FieldSchema("Col_Keyword_Virtual_Long", FieldType.LONG) //设置字段名和类型。
                .setVirtualField(true) //设置字段是否为虚拟列。
                .setSourceFieldName("Col_Keyword"), //虚拟列对应的数据表中字段。
            new FieldSchema("Col_Long", FieldType.LONG),
            new FieldSchema("Col_Long_Virtual_Keyword", FieldType.KEYWORD)
                .setVirtualField(true)
                .setSourceFieldName("Col_Long")));
        request.setIndexSchema(indexSchema);
        client.createSearchIndex(request); //调用client创建多元索引。
    }