如果要在某张表上使用多元索引功能,首先需要在这张表上创建一个多元索引,一张表可以创建多个多元索引。

只有在多元索引中包括的字段(包括主键列和属性列)才可以通过Search接口查询到。

定义

创建多元索引的API是CreateSearchIndex,具体参数说明如下:
  • TableName:指定为哪一张表创建多元索引。
  • IndexName:多元索引的名称。
  • IndexSchema:多元索引的Schema定义:
    • IndexSetting
      • RoutingFields:自定义路由字段。可以选择部分主键列作为路由字段,在进行索引数据写入时,会根据路由字段的值计算索引数据的分布位置,路由字段的值相同的记录会被索引到相同的数据分区中。
    • FieldSchemas
      • FieldName:必选,String类型,字段名称,必须是表中有的列名。
      • FieldType:必选,字段类型,详见字段类型
      • Index:可选,Boolean类型,默认为true,表示是否对该字段建立索引。
      • IndexOptions:可选,表示是否存储position,offset等term信息到倒排链中,一般用默认值即可。
      • Analyzer:可选,分词器类型,目前支持多种分词类型,详见分词
      • EnableSortAndAgg:可选,Boolean类型,默认为true,表示是否允许该字段支持排序和统计。
      • Store:可选,Boolean类型,默认为true,表示是否在索引中存储原始值,可以加速查询速度。

FAQ

一张表中的数据应该创建几个索引?

例如有一张表有5个字段:id、name、age、city、sex,需要按照name或age或city查询,那么有两种创建多元索引的方式:

  • 第一种:一个字段建立一个多元索引

    这时候需要创建3个多元索引,分别是name_index、age_index、city_index,如果要按照城市查询就查询city_index,如果要按照年龄查询就查询age_index。

    如果要查询年龄小于12岁,且城市是成都的学生,这种方式就查询不了了。

    这种实现类似于二级索引,但是在多元索引中并没有任何好处,而且会带来更高的费用,所以不建议按这种方式创建多元索引。

  • 第二种:一张表中多个字段创建在一个多元索引中

    这时候只需要创建一个多元索引,名字是student_index,字段包括name、age、city,如果要按照城市查询,就查询student_index中city字段即可,如果要查询年龄,就查询student_index中age字段。

    如果要查询年龄小于12岁,且城市是成都的学生,就查询student_index中age和city字段即可。

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

限制

创建索引的时效性

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

数量限制

详见使用限制

示例

/**
 *创建一个多元索引,包含Col_Keyword和Col_Long两列,类型分别设置为字符串(KEYWORD)和整型(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
}