すべてのプロダクト
Search
ドキュメントセンター

Tablestore:配列データ型とネストデータ型

最終更新日:Dec 28, 2024

検索インデックスは、Long、Double、Boolean、Keyword、Text、Date、Geopoint、Vectorなどのプリミティブデータ型をサポートしています。検索インデックスは、配列データ型とネストデータ型もサポートしています。配列データ型は、同じ型のデータのコレクションを格納するのに適しています。ネストデータ型はJSONデータ型に似ており、階層構造を持つデータを格納するのに適しています。

配列データ型

重要
  • 配列データ型は検索インデックスでのみ使用できます。

  • ベクトルデータ型は配列で使用できません。

配列データ型は複合データ型であり、Long、Double、Boolean、Keyword、Text、Date、Geopointなどのプリミティブデータ型と組み合わせて、複雑なデータ構造を構築できます。たとえば、Longデータ型と配列データ型の組み合わせは、long整数の配列を構築するために使用されます。long配列には複数のlong整数を格納できます。クエリの際にlong整数のいずれかが一致すると、対応する行が返されます。配列データ型は、同じ型のデータのコレクションを格納するのに適しています。

配列の形式

次の表は、検索インデックスにおける配列データ型とプリミティブデータ型の組み合わせについて説明しています。

組み合わせ

説明

Long配列

long整数の配列。形式:"[1000, 4, 5555]"

Double配列

浮動小数点数の配列。形式:"[3.1415926, 0.99]"

Boolean配列

ブール値の配列。形式:[true, false]

Keyword配列

文字列の配列。キーワード配列はJSON配列です。例:"[\"Hangzhou\", \"Xi'an\"]"

Text配列

テキストの配列。テキスト配列はJSON配列です。例:"[\"Hangzhou\", \"Xi'an\"]"

テキスト配列はあまり使用されません。

Date配列

日付データの配列。整数型の日付データの形式:"[1218197720123, 1712850436000]"。文字列型の日付データの形式:"[\"2024-04-11 23:47:16.854775807\", \"2024-06-11 23:47:16.854775807\"]"

Geopoint配列

緯度と経度の座標ペアの配列。形式:[\"34.2, 43.0\", \"21.4, 45.2\"]

使用上の注意

検索インデックスのフィールドのデータ型が、LongやDoubleなどの配列データ型とプリミティブデータ型の組み合わせである場合、検索インデックスが作成されるデータテーブルのフィールドはString型である必要があり、検索インデックスのフィールドは対応するプリミティブデータ型である必要があります。たとえば、priceフィールドはDouble配列型です。データテーブルのpriceフィールドの値はString型、検索インデックスのpriceフィールドの値はDouble型、isArray=true設定が構成されている必要があります。

ネストデータ型

ネスト型のデータはネストされたドキュメントです。ネストされたドキュメントは、データの行(ドキュメント)に複数の子行(子ドキュメント)が含まれている場合に使用されます。複数の子行はネストされたフィールドに格納されます。ネストデータ型は、階層構造を持つデータを格納するのに適しています。

ネストされたフィールドの子行のスキーマを指定する必要があります。スキーマには、子行のフィールドと各フィールドのプロパティが含まれている必要があります。ネストデータ型は、JSONデータ型と同様に、複数の値を格納するために使用できます。

ネストの形式

ネストされたフィールドは、単一レベルと複数レベルのネストされたフィールドに分類されます。次の表で、2つのタイプについて説明します。

タイプ

説明

単一レベルのネストされたフィールド

単一レベルのネストされたフィールドは、1つのレベルのみを含む単純なデータ構造を持っています。単一レベルのネストされたフィールドは、複数レベルのデータ構造は必要ないが、階層構造が必要なシナリオに適しています。例:

[
    {
        "tagName": "tag1",
        "score": 0.8
    },
    {
        "tagName": "tag2",
        "score": 0.2
    }
]

複数レベルのネストされたフィールド

複数レベルのネストされたフィールドは、複数レベルを含む複雑なデータ構造を持っています。複数レベルのネストされたフィールドは、さまざまなレベルの編成されたデータを集中モジュールに格納するために複雑なデータ構造が必要なシナリオに適しています。例:

[
    {
        name:"John",
        "age": 20,
        "phone": "1390000****",
        "address": [
            {
                "province": "Zhejiang",
                "city": "Hangzhou",
                "street": "1201 Xingfu Community, Sunshine Avenue"
            }
        ]
    }
]

使用上の注意

検索インデックスのフィールドがネスト型の場合、検索インデックスが作成されるデータテーブルのフィールドはString型である必要があり、検索インデックスのフィールドはネスト型である必要があります。ネスト型のフィールドをクエリするには、ネストクエリを実行する必要があります。

データテーブルのフィールドにデータを書き込み、そのフィールドがデータテーブル用に作成された検索インデックスのネストされたフィールドに対応する場合、データテーブルのフィールドがJSON配列型であることを確認してください。例:[{"tagName":"tag1", "score":0.8,"time": 1730690237000 }, {"tagName":"tag2", "score":0.2,"time": 1730691557000}]

重要

フィールドに子行が1つしか含まれていないかどうかに関係なく、JSON配列型の文字列をネストされたフィールドに書き込む必要があります。

単一レベルのネストされたフィールドの例

コンソールまたはSDKを使用して、単一レベルのネストされたフィールドを作成できます。

このセクションでは、Tablestore SDK for Javaを使用して単一レベルのネストされたフィールドを作成する方法の例を示します。この例では、tagsという名前のネストされたフィールドを使用します。各子行には3つのフィールドが含まれています。次の図は詳細を示しています。

image

  • フィールド名:tagName。フィールドタイプ:String。

  • フィールド名:score。フィールドタイプ:Double。

  • フィールド名:time。フィールドタイプ:Date。単位:ミリ秒。

次のデータがデータテーブルに書き込まれます:[{"tagName":"tag1", "score":0.8,"time": 1730690237000 }, {"tagName":"tag2", "score":0.2,"time": 1730691557000}]

// 子行のフィールドのスキーマを作成します。
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));
subFieldSchemas.add(new FieldSchema("time", FieldType.DATE)
    .setDateFormats(Arrays.asList("epoch_millis")));

// ネストされたフィールドのsubfieldSchemasの値として、子行用に作成されたスキーマを使用します。
FieldSchema nestedFieldSchema = new FieldSchema("tags", FieldType.NESTED)
    .setSubFieldSchemas(subFieldSchemas);

複数レベルのネストされたフィールドの例

SDKを使用して、複数レベルのネストされたフィールドを作成できます。

このセクションでは、Tablestore SDK for Javaを使用して複数レベルのネストされたフィールドを作成する方法の例を示します。この例では、userという名前のネストされたフィールドを使用します。各子行には、異なるプリミティブフィールドタイプの4つのフィールドと1つのネストされたフィールドが含まれています。

  • フィールド名:name。フィールドタイプ:Keyword。

  • フィールド名:age。フィールドタイプ:Long。

  • フィールド名:birth。フィールドタイプ:Date。

  • フィールド名:phone。フィールドタイプ:Keyword。このフィールドの値は日付形式です。

  • ネストされたフィールド名:address。各子行のフィールド名:province、city、street。各子行のすべてのフィールドのフィールドタイプ:Keyword。

次のデータがデータテーブルに書き込まれます:[ {"name":"John","age":20,"brith":"2014-10-10 12:00:00.000","phone":"1390000****","address":[{"province":"Zhejiang","city":"Hangzhou","street":"1201 Xingfu Community, Sunshine Avenue"}]}]

// addressネストされたフィールドの子行の3つのフィールドのスキーマを作成します。user.addressで指定されたパスを使用して、子行のフィールドのデータをクエリできます。
List<FieldSchema> addressSubFiledSchemas = new ArrayList<>();
addressSubFiledSchemas.add(new FieldSchema("province",FieldType.KEYWORD));
addressSubFiledSchemas.add(new FieldSchema("city",FieldType.KEYWORD));
addressSubFiledSchemas.add(new FieldSchema("street",FieldType.KEYWORD));

// userネストされたフィールドの各子行のスキーマを作成します。各子行には、異なるプリミティブフィールドタイプの3つのフィールドと、addressという名前の1つのネストされたフィールドが含まれています。userで指定されたパスを使用して、子行のフィールドのデータをクエリできます。
List<FieldSchema> subFieldSchemas = new ArrayList<>();
subFieldSchemas.add(new FieldSchema("name",FieldType.KEYWORD));
subFieldSchemas.add(new FieldSchema("age",FieldType.LONG));
subFieldSchemas.add(new FieldSchema("birth",FieldType.DATE).setDateFormats(Arrays.asList("yyyy-MM-dd HH:mm:ss.SSS")));
subFieldSchemas.add(new FieldSchema("phone",FieldType.KEYWORD));
subFieldSchemas.add(new FieldSchema("address",FieldType.NESTED).setSubFieldSchemas(addressSubFiledSchemas));

// ネストされたフィールドのsubfieldSchemasの値として、userネストされたフィールドの子行用に作成されたスキーマを使用します。
List<FieldSchema> fieldSchemas = new ArrayList<>();
fieldSchemas.add(new FieldSchema("user",FieldType.NESTED).setSubFieldSchemas(subFieldSchemas));

制限

  • ネストされたインデックスは、さまざまなシナリオでクエリのパフォーマンスを向上させるために使用できるIndexSort機能をサポートしていません。

  • ネストされたフィールドを含む検索インデックスを使用してデータをクエリし、ページネーションが必要な場合は、クエリ条件でデータを返すソート方法を指定する必要があります。そうしないと、クエリ条件を満たすデータの一部のみが読み取られた場合、TablestoreはnextTokenを返しません。

  • ネストクエリは、他のタイプのクエリよりもパフォーマンスが低くなります。

ネストデータ型は、すべてのクエリ、ソート、および集計で使用できます。

参照