多元索引除了提供Long、Double、Boolean、Keyword、Text和GeoPoint等基本类型外,还提供了两种特殊的类型数组和嵌套。

数组类型

数组类型属于附加类型,可以附加在Long、Double、Boolean、Keyword、Text和GeoPoint等基本类型之上。例如Long类型+数组后,即为数组长整型,该字段中可以包括多个长整型数字,查询数据时其中任何一个匹配都可以返回该行数据。

基本类型的数组形式,例如:

  • Long Array

    长整型的数组形式,格式:“[1000, 4, 5555]”。

  • Boolean Array

    布尔值的数组形式,格式:“[true, false]”。

  • Double Array

    浮点数的数组形式,格式:“[3.1415926, 0.99]”。

  • Keyword Array

    字符串的数组形式,格式为JSON Array,示例: “[\"杭州\", \"西安\"]” 。

  • Text Array

    文本的数组形式,格式为JSON Array,示例:“[\"杭州\", \"西安\"]” 。对于Text类型,一般无需使用数组形式。

  • GeoPoint Array

    地理位置点的数组形式,格式:"[\"34.2, 43.0\", \"21.4, 45.2\"]"。

数组类型仅是多元索引中的概念,数据表中还未支持数组。对于多元索引中数组类型的字段,在数据表中必须为String类型,对应的多元索引中的类型必须为相应的类型,例如Long、Double等。如果字段price是Double Array数组类型,则在数据表中price必须为String类型,在对应的多元索引中的类型必须为Double类型,且附加isArray=true属性。

嵌套类型

嵌套类型(Nested)代表嵌套文档类型。嵌套文档是指对于一行数据(文档)可以包含多个子文档,多个子文档保存在一个嵌套类型列中。对于一个嵌套类型列,需要指定其子文档的结构,即子文档中包含哪些字段以及每个字段的属性。类似数组,但是功能更丰富。

  • 示例代码
    以Java代码为例:
    //构造子文档的FieldSchema。
    List<FieldSchema> subFieldSchemas = new ArrayList<FieldSchema>();
    subFieldSchemas.add(new FieldSchema("tagName", FieldType.KEYWORD)
        .setIndex(true).setEnableSortAndAgg(true));
    subFieldSchemas.add(new FieldSchema("score", FieldType.DOUBLE)
        .setIndex(true).setEnableSortAndAgg(true));
    
    //将子文档的FieldSchema设置到NESTED列的subfieldSchemas中。
    FieldSchema nestedFieldSchema = new FieldSchema("tags", FieldType.NESTED)
        .setSubFieldSchemas(subFieldSchemas);
    以上的示例代码定义了一个嵌套类型列的格式,该列列名为tags,子文档中包含以下两个字段:
    • 一个字段名为tagName,类型为字符串类型(Keyword)。
    • 一个字段名为score,类型为浮点数(Double)。
    嵌套类型列在写入时是作为字符串类型写到数据表的,字符串的格式是JSON对象的数组。按照以上示例代码中定义的嵌套类型列的格式的数据格式举例如下,该列中包含了两个子文档。
    注意 即使只有一个子文档,也必须按照JSON数组的格式构造字符串。
    [{"tagName":"tag1", "score":0.8}, {"tagName":"tag2", "score":0.2}]
  • 嵌套类型的局限性
    • 由于含有嵌套类型字段的多元索引不支持索引预排序(IndexSort),而索引预排序功能在很多场景下可以带来很大性能提升。
    • 如果使用含有嵌套类型字段的多元索引查询数据且需要翻页,则必须在查询条件中指定数据返回的排序方式,否则当符合查询条件的数据未读取完时,服务端不会返回nextToken。
    • 嵌套类型的查询性能相比其他类型的查询性能更低一些。

    嵌套类型除了上述局限性外,和非嵌套类型支持的功能相同,支持所有的查询类型、排序和统计聚合。

如果想了解更多Array和Nested的对比,请参见Array和Nested对比