検索インデックスは、Long、Double、Boolean、Keyword、Text、Date、Geopoint、Vectorなどのプリミティブデータ型をサポートしています。検索インデックスは、配列データ型とネストデータ型もサポートしています。配列データ型は、同じ型のデータのコレクションを格納するのに適しています。ネストデータ型はJSONデータ型に似ており、階層構造を持つデータを格納するのに適しています。
配列データ型
配列データ型は検索インデックスでのみ使用できます。
ベクトルデータ型は配列で使用できません。
配列データ型は複合データ型であり、Long、Double、Boolean、Keyword、Text、Date、Geopointなどのプリミティブデータ型と組み合わせて、複雑なデータ構造を構築できます。たとえば、Longデータ型と配列データ型の組み合わせは、long整数の配列を構築するために使用されます。long配列には複数のlong整数を格納できます。クエリの際にlong整数のいずれかが一致すると、対応する行が返されます。配列データ型は、同じ型のデータのコレクションを格納するのに適しています。
配列の形式
次の表は、検索インデックスにおける配列データ型とプリミティブデータ型の組み合わせについて説明しています。
組み合わせ | 説明 |
Long配列 | long整数の配列。形式: |
Double配列 | 浮動小数点数の配列。形式: |
Boolean配列 | ブール値の配列。形式: |
Keyword配列 | 文字列の配列。キーワード配列はJSON配列です。例: |
Text配列 | テキストの配列。テキスト配列はJSON配列です。例: テキスト配列はあまり使用されません。 |
Date配列 | 日付データの配列。整数型の日付データの形式: |
Geopoint配列 | 緯度と経度の座標ペアの配列。形式: |
使用上の注意
検索インデックスのフィールドのデータ型が、LongやDoubleなどの配列データ型とプリミティブデータ型の組み合わせである場合、検索インデックスが作成されるデータテーブルのフィールドはString型である必要があり、検索インデックスのフィールドは対応するプリミティブデータ型である必要があります。たとえば、priceフィールドはDouble配列型です。データテーブルのpriceフィールドの値はString型、検索インデックスのpriceフィールドの値はDouble型、isArray=true
設定が構成されている必要があります。
ネストデータ型
ネスト型のデータはネストされたドキュメントです。ネストされたドキュメントは、データの行(ドキュメント)に複数の子行(子ドキュメント)が含まれている場合に使用されます。複数の子行はネストされたフィールドに格納されます。ネストデータ型は、階層構造を持つデータを格納するのに適しています。
ネストされたフィールドの子行のスキーマを指定する必要があります。スキーマには、子行のフィールドと各フィールドのプロパティが含まれている必要があります。ネストデータ型は、JSONデータ型と同様に、複数の値を格納するために使用できます。
ネストの形式
ネストされたフィールドは、単一レベルと複数レベルのネストされたフィールドに分類されます。次の表で、2つのタイプについて説明します。
タイプ | 説明 |
単一レベルのネストされたフィールド | 単一レベルのネストされたフィールドは、1つのレベルのみを含む単純なデータ構造を持っています。単一レベルのネストされたフィールドは、複数レベルのデータ構造は必要ないが、階層構造が必要なシナリオに適しています。例:
|
複数レベルのネストされたフィールド | 複数レベルのネストされたフィールドは、複数レベルを含む複雑なデータ構造を持っています。複数レベルのネストされたフィールドは、さまざまなレベルの編成されたデータを集中モジュールに格納するために複雑なデータ構造が必要なシナリオに適しています。例:
|
使用上の注意
検索インデックスのフィールドがネスト型の場合、検索インデックスが作成されるデータテーブルのフィールドは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つのフィールドが含まれています。次の図は詳細を示しています。
フィールド名: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を返しません。
ネストクエリは、他のタイプのクエリよりもパフォーマンスが低くなります。
ネストデータ型は、すべてのクエリ、ソート、および集計で使用できます。
参照
検索インデックスを使用してデータをクエリする場合、次のクエリメソッドを使用できます:タームクエリ、タームズクエリ、すべて一致クエリ、一致クエリ、一致フレーズクエリ、プレフィックスクエリ、範囲クエリ、ワイルドカードクエリ、あいまいクエリ、ブールクエリ、地理クエリ、ネストクエリ、KNNベクトル検索、および存在クエリ。ビジネス要件に基づいてクエリメソッドを選択し、複数のディメンションからデータをクエリできます。
ソートおよびページング機能を使用して、クエリ条件を満たす行をソートまたはページングできます。詳細については、ソートとページングの実行を参照してください。
折りたたみ(重複排除)機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。これにより、指定されたタイプのデータはクエリ結果に1回だけ表示されます。詳細については、折りたたみ(重複排除)を参照してください。
データテーブルのデータを分析する場合は、検索操作の集計機能を使用するか、SQLステートメントを実行できます。たとえば、最小値と最大値、合計、および行の総数を取得できます。詳細については、集計とSQLクエリを参照してください。
行をソートする必要なく、クエリ条件を満たすすべての行を取得する場合は、ParallelScanおよびComputeSplits操作を呼び出して、並列スキャン機能を使用できます。詳細については、並列スキャンを参照してください。