NestedQuery を使用して、ネストされたフィールドのサブ行内のデータをクエリします。ネスト型は直接クエリできません。NestedQuery でクエリをラップし、ネストされたフィールドのパスとサブクエリを指定する必要があります。サブクエリには任意のクエリタイプを使用できます。
前提条件
-
OTSClient インスタンスが初期化されています。詳細については、「OTSClient インスタンスの初期化」をご参照ください。
-
データテーブルが作成され、データがそのデータテーブルに書き込まれます。詳細については、「データテーブルを作成する」および「データを書き込む」をご参照ください。
-
データテーブルに対して検索インデックスが作成されます。詳細については、「検索インデックスを作成する」をご参照ください。
パラメーター
|
パラメーター |
説明 |
|
tableName |
データテーブルの名前です。 |
|
indexName |
検索インデックスの名前。 |
|
path |
ネストされたフィールドのパスです。たとえば、 |
|
query |
ネストされたフィールドのサブフィールドに対して実行するクエリです。任意のクエリタイプがサポートされます。 |
|
scoreMode |
フィールドに複数の値が含まれる場合に使用するスコアモードです。 |
|
InnerHits |
ネストされたフィールドのサブフィールドに関する設定です。以下のオプションが含まれます。
|
使用例
単一レベルのネストされたクエリの例
Col_Nested.Sub_Col_Keyword が "happy" に等しい行をクエリします。Col_Nested はネストされたフィールドであり、そのサブ行には Sub_Col_Keyword サブフィールドが含まれます。
/**
* Col_Nested のサンプルネストデータ: '[{Sub_Col_Keyword: "happy"},{Sub_Col_Keyword: "sunny"}]'
*/
client.search({
tableName: "<TABLE_NAME>",
indexName: "<SEARCH_INDEX_NAME>",
searchQuery: {
offset: 0,
limit: 10, // 特定のデータを取得せずに件数のみを取得する場合は、limit を 0 に設定します。これにより、行が返されなくなります。
query: { // クエリタイプを TableStore.QueryType.NESTED_QUERY に設定します。
queryType: TableStore.QueryType.NESTED_QUERY,
query: {
path: "Col_Nested",
query: {
queryType: TableStore.QueryType.TERM_QUERY,
query: {
fieldName: "Col_Nested.Sub_Col_Keyword",
term: "happy"
}
},
}
},
getTotalCount: true // 結果の TotalCount はテーブル内の行の総数を示します。デフォルト値は false で、この場合総件数は返されません。
},
columnToGet: { // 返すカラムを指定します。RETURN_SPECIFIED(カスタムカラムを返す)、RETURN_ALL(すべてのカラムを返す)、RETURN_ALL_FROM_INDEX(多次元インデックスからすべてのカラムを返す)、または RETURN_NONE(カラムを返さない)に設定できます。
returnType: TableStore.ColumnReturnType.RETURN_ALL
}
}, function (err, data) {
if (err) {
console.log('error:', err);
return;
}
console.log('success:', JSON.stringify(data, null, 2));
});
ネストされたクエリでのまとめとハイライトの使用例
NestedQuery を使用して、Col_Nested ネストフィールド内の Sub_Col_Text サブフィールドが tablestore に一致する行を検索し、結果内で一致した語句をハイライトします。
client.search({
tableName: "<TABLE_NAME>",
indexName: "<SEARCH_INDEX_NAME>",
searchQuery: {
offset: 0,
limit: 10, // 特定のデータを取得せずに件数のみを取得する場合は、limit を 0 に設定します。これにより、行が返されなくなります。
query: { // クエリタイプを TableStore.QueryType.NESTED_QUERY に設定します。
queryType: TableStore.QueryType.NESTED_QUERY,
query: {
path: "Col_Nested",
query: {
queryType: TableStore.QueryType.MATCH_QUERY,
query: {
fieldName: "Col_Nested.Sub_Col_Text",
text: "tablestore"
}
},
innerHits: {
sort: {
sorters: [
{
scoreSort: {
order: TableStore.SortOrder.SORT_ORDER_DESC
}
},
{
docSort: {
order: TableStore.SortOrder.SORT_ORDER_ASC
}
},
],
},
highlight: {
highlightParameters: [
{
fieldName:"Col_Nested.Sub_Col_Text",
preTag: "",
postTag: "",
fragmentsOrder: TableStore.HighlightFragmentOrder.TEXT_SEQUENCE,
fragmentSize: 20,
numberOfFragments: 3,
}
]
}
},
}
},
getTotalCount: true // 結果の TotalCount はテーブル内の行の総数を示します。デフォルト値は false で、この場合総件数は返されません。
},
columnToGet: { // 返すカラムを指定します。RETURN_SPECIFIED(カスタムカラムを返す)、RETURN_ALL(すべてのカラムを返す)、RETURN_ALL_FROM_INDEX(多次元インデックスからすべてのカラムを返す)、または RETURN_NONE(カラムを返さない)に設定できます。
returnType: TableStore.ColumnReturnType.RETURN_ALL
}
}, function (err, data) {
if (err) {
console.log('error:', err);
return;
}
console.log('success:', JSON.stringify(data.rows, null, 2));
printSearchHit(data.searchHits, "");
});
/**
* searchHit の内容を出力します。
* @param searchHits searchHits オブジェクト。
* @param prefix 階層構造を出力するためにネストされた構造に付加するプレフィックス。
*/
function printSearchHit(searchHits, prefix) {
TableStore.util.arrayEach(searchHits, function (searchHit) {
if (searchHit.highlightResultItem != null) {
console.log(prefix + "Highlight: \n");
var strBuilder = ""
for (const [key,val] of searchHit.highlightResultItem.highlightFields.entries()) {
strBuilder += key + ":[";
strBuilder += val.fragments.join(",") + "]\n";
console.log(strBuilder);
}
}
for (const [key,val] of searchHit.searchInnerHits.entries()) {
console.log(prefix + "Path: " + key + "\n");
console.log(prefix + "InnerHit: \n");
printSearchHit(val.subSearchHits, prefix + " ");
}
});
}
よくある質問
関連ドキュメント
多次元インデックスでは以下のクエリタイプがサポートされています:完全一致検索、複数値完全一致検索、完全一致検索、一致検索、フレーズ一致検索、プレフィックス検索、範囲クエリ、ワイルドカード検索、ブール値クエリ、ジオクエリ、ネストされたクエリ、ベクタークエリ、およびexists クエリ。ビジネス要件に基づいて適切なクエリタイプを選択し、データをクエリできます。
クエリ条件を満たす行をソートまたはページングする場合は、ソートおよびページング機能を使用できます。詳細については、「ソートおよびページング」をご参照ください。
特定のカラムに基づいて結果セットを折りたたみたい場合は、折りたたみ(distinct)機能を使用できます。これにより、指定されたタイプのデータがクエリ結果内に一度だけ表示されます。詳細については、「折りたたみ(distinct)」をご参照ください。
データテーブル内のデータを分析したい場合(たとえば、極値、合計、行数の取得など)、集約操作を実行するか、SQL ステートメントを実行できます。詳細については、「集約」および「SQL クエリ」をご参照ください。
行をソートする必要がなく、クエリ条件を満たすすべての行を迅速に取得したい場合は、ParallelScan 操作および ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、「並列スキャン」をご参照ください。