検索インデックスを使用してデータをクエリする場合、定義済みのソート方法を使用するか、ソート方法を指定できます。このようにして、クエリ条件を満たす行は、事前に定義または指定した順序に基づいて返されます。レスポンスに多数の行が含まれている場合は、limit パラメーターと offset パラメーターを設定するか、トークンを使用して必要なデータを特定できます。
シナリオ
カテゴリ | 方法 | 機能 | シナリオ |
ソート | 検索インデックスの作成時にソート方法を事前に定義する | デフォルトでは、検索インデックスのデータは、IndexSort パラメーターで指定された事前ソート設定に基づいてソートされます。 IndexSort パラメーターで指定された事前ソート設定により、クエリ条件を満たす行が返されるデフォルトの順序が決まります。 | |
データをクエリするときにソート方法を指定する | ScoreSort を使用して、BM25ベースのキーワード関連性スコアに基づいてクエリ結果をソートできます。 ScoreSort は、全文検索などのシナリオに適しています。 | ||
PrimaryKeySort を使用して、プライマリキー値に基づいてクエリ結果をソートできます。 PrimaryKeySort は、データの一意の識別子に基づいてデータをソートする場合に適しています。 | |||
FieldSort を使用して、1 つ以上の列の値に基づいてクエリ結果をソートできます。 FieldSort は、売上高やページビューなどのプロパティに基づいてデータをソートする場合に適しています。ほとんどの場合、FieldSort は、eコマース、ソーシャルネットワーキング、メディアアセットなどの業界で使用されます。 | |||
GeoDistanceSort を使用して、地理的な場所によってクエリ結果をソートできます。 GeoDistanceSort は、特定の場所からの距離に基づいてデータをソートする場合に適しています。ほとんどの場合、GeoDistanceSort は、マッピングや物流などの業界で使用されます。たとえば、場所の周りのレストランを、その場所からの距離に基づいてソートできます。 | |||
ページング | データをクエリするときにページング方法を指定する | レスポンスの行数が 100,000 未満の場合は、この方法を使用してページにジャンプできます。 | |
この機能を使用すると、データはページごとに返され、後方へのみページングできます。前方へページングする場合は、トークンはクエリ中に有効であるため、前のトークンをキャッシュして使用できます。 |
インデックスの事前ソート
デフォルトでは、検索インデックスのデータは、IndexSort パラメーターで指定された事前ソート設定に基づいてソートされます。検索インデックスを使用してデータをクエリする場合、IndexSort パラメーターで指定された事前ソート設定により、一致するデータが返されるデフォルトの順序が決まります。
検索インデックスを作成するときに、IndexSort パラメーターを設定することで、事前ソート設定を指定できます。事前ソート設定を指定しない場合、検索インデックスのデータはプライマリキー値でソートされます。
検索インデックスの事前ソート方法として、PrimaryKeySort または FieldSort を指定できます。 PrimaryKeySort はプライマリキー値でデータをソートし、FieldSort はフィールド値でデータをソートします。
Nested フィールドを含む検索インデックスは、インデックスの事前ソートをサポートしていません。
既存の検索インデックスの IndexSort パラメーターの設定を変更する場合は、検索インデックスのスキーマを動的に変更できます。詳細については、検索インデックスのスキーマを動的に変更するを参照してください。
データをクエリするときにソート方法を指定する
ソートは、enableSortAndAgg パラメーターが true に設定されているフィールドに対してのみ有効にできます。
クエリごとにソート方法を指定できます。検索インデックスベースのクエリは、次のソート方法をサポートしています。優先順位に基づいて複数のソート方法を指定することもできます。
ScoreSort
ScoreSort を使用して、BM25ベースのキーワード関連性スコアに基づいてクエリ結果をソートできます。 ScoreSort は、全文検索などのシナリオに適しています。
キーワード関連性スコアで一致するデータをソートする前に、ScoreSort のパラメーターを設定する必要があります。設定しない場合、一致するデータは、IndexSort パラメーターで指定された事前ソート設定に基づいてソートされます。
sort: {
sorters: [
{
scoreSort: {
order: TableStore.SortOrder.SORT_ORDER_ASC // クエリ結果を昇順にソートします。
}
}
]
}
PrimaryKeySort
PrimaryKeySort を使用して、プライマリキー値に基づいてクエリ結果をソートできます。
sort: {
sorters: [
{
primaryKeySort: {
order: TableStore.SortOrder.SORT_ORDER_DESC // クエリ結果を降順にソートします。
//order: TableStore.SortOrder.SORT_ORDER_ASC // クエリ結果を昇順にソートします。
}
}
]
}
FieldSort
FieldSort を使用して、1 つ以上の特定の列の値に基づいてクエリ結果をソートできます。
単一列の値に基づいてクエリ結果をソートする
FieldSort を使用して、特定の列の値に基づいてクエリ結果をソートできます。
sort: {
sorters: [
{
fieldSort: {
fieldName: "Col_Keyword",
order: TableStore.SortOrder.SORT_ORDER_DESC
}
}
]
}
複数列の値に基づいてクエリ結果をソートする
特定の順序で 2 つの列の値に基づいてクエリ結果をソートして、一致するデータが返される順序を決定することもできます。
sort: {
sorters: [
{
fieldSort: {
fieldName: "Col_Keyword",
order: TableStore.SortOrder.SORT_ORDER_DESC
}
},
{
fieldSort: {
fieldName: "Col_Long",
order: TableStore.SortOrder.SORT_ORDER_DESC
}
}
]
}
GeoDistanceSort
GeoDistanceSort を使用して、地理的な場所によってクエリ結果をソートできます。
sort: {
sorters: [
{
geoDistanceSort: {
fieldName: "Col_Geo_Point",
points: ["0,0"],// 中心点の座標ペアを指定します。
order: TableStore.SortOrder.SORT_ORDER_ASC // クエリ結果は、地理的な場所と中心点の間の距離の昇順で返されます。
}
}
]
}
詳細なサンプルコードについては、検索を参照してください。
ページング方法を指定する
limit パラメーターと offset パラメーターを設定するか、トークンを使用してレスポンスの行をページングできます。
limit パラメーターと offset パラメーターを設定する
レスポンスの行の合計数が 100,000 未満の場合は、limit パラメーターと offset パラメーターを設定して行をページングできます。 limit パラメーターと offset パラメーターの値の合計は 100,000 を超えることはできません。 limit パラメーターの最大値は 100 です。
limit パラメーターの最大値を増やす方法については、検索インデックス機能の Search オペレーションを呼び出してデータをクエリするときに、limit パラメーターの値を 1000 に増やすにはどうすればよいですか?を参照してください。
limit パラメーターと offset パラメーターの値を指定しない場合は、デフォルト値が使用されます。 limit パラメーターのデフォルト値は 10 です。 offset パラメーターのデフォルト値は 0 です。
/**
* offset を 90 に、limit を 10 に設定して、90 行目から 99 行目のデータをスキャンします。
*/
client.search({
tableName: TABLE_NAME,
indexName: INDEX_NAME,
searchQuery: {
offset: 90,
limit: 10,
query: {
queryType: TableStore.QueryType.MATCH_ALL_QUERY
},
getTotalCount: true // クエリ条件を満たす行の合計数を返すかどうかを指定します。デフォルト値:false。
},
columnToGet: { // 返す列を指定します。 columnToGet パラメーターを RETURN_SPECIFIED に設定して指定された列を返すか、RETURN_ALL に設定してすべての列を返すか、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));
});
トークンを使用する
この方法にはページングの深さに制限がないため、深いページングにはトークンを使用することをお勧めします。
Tablestore がクエリ条件を満たすすべてのデータを読み取れない場合、Tablestore は nextToken を返します。 nextToken を使用して、後続のデータの読み取りを続行できます。
デフォルトでは、トークンを使用する場合、後方へのみページングできます。ただし、トークンはクエリ中に有効であるため、前のトークンをキャッシュして使用して前方へページングできます。
NextToken を永続化するか、NextToken をフロントエンドページに転送する場合は、Base64 を使用して NextToken を文字列にエンコードできます。トークンは文字列ではありません。 string(NextToken)
を使用してトークンを文字列にエンコードすると、トークンに関する情報が失われます。
トークンを使用する場合、ソート方法は前のリクエストで使用された方法と同じです。 Tablestore は、デフォルトでは IndexSort パラメーターに基づいて、または指定した方法に基づいてデータをソートします。トークンを使用する場合、ソート方法を指定することはできません。トークンを使用する場合、offset パラメーターを設定することはできません。データは順番にページごとに返されます。これにより、クエリが遅くなります。
Nested フィールドを含む検索インデックスは、IndexSort をサポートしていません。ページングが必要で、Nested フィールドを含む検索インデックスを使用してデータをクエリする場合は、クエリ条件でソート方法を指定して、指定された順序でデータを返す必要があります。そうしないと、クエリ条件を満たすデータの一部のみが返された場合、Tablestore は nextToken を返しません。
/**
* トークンを使用して、同期モードと非同期モードでレスポンスの行をページングします。
*/
var params = {
tableName: TABLE_NAME,
indexName: INDEX_NAME,
searchQuery: {
offset: 0,
limit: 10,
token: null,// nextToken を開始点として取得して次のページをスキャンします。データ型はバイトストリームです。
query: {
queryType: TableStore.QueryType.MATCH_ALL_QUERY
},
getTotalCount: true
},
columnToGet: {
returnType: TableStore.ColumnReturnType.RETURN_SPECIFIED,
returnNames: ["pic_tag", "pic_description", "time_stemp", "pos"]
}
};
/**
* トークンを使用して、同期モードでレスポンスの行をページングします。
*/
(async () => { // 同期モードで行をページングします。
try {
var data = await client.search(params);
console.log('success:', JSON.stringify(data, null, 2));
while (data.nextToken && data.nextToken.length) { // nextToken が返された場合、Tablestore は後続のデータの読み取りを続けます。
// トークンを永続化します。
//1) Buffer オブジェクト内のバイナリデータとしてのトークン (nextToken) を Base64 エンコードされた文字列に変換し、文字列を永続化します。
//2) 永続化された Base64 文字列を、Buffer オブジェクトを作成することでバイナリデータに変換して、nextToken をパラメーターとして使用できます。
var nextToken = data.nextToken.toString("base64");
var token = Buffer.from(nextToken, "base64");
params.searchQuery.token = token;// トークン値を更新して、より多くの結果を返します。
data = await client.search(params);
console.log('token success:', JSON.stringify(data, null, 2));
}
} catch (error) {
console.log(error);
}
})()
/**
* トークンを使用して、非同期モードでレスポンスの行をページングします。
*/
client.search(params, function (err, data) {
console.log('success:', JSON.stringify(data, null, 2));
if (data.nextToken && data.nextToken.length) {
// トークンを永続化します。
//1) Buffer オブジェクト内のバイナリデータとしてのトークン (nextToken) を Base64 エンコードされた文字列に変換し、文字列を永続化します。
//2) 永続化された Base64 文字列を、Buffer オブジェクトを作成することでバイナリデータに変換して、nextToken をパラメーターとして使用できます。
var nextToken = data.nextToken.toString("base64");
var token = Buffer.from(nextToken, "base64");
params.searchQuery.token = token;// トークン値を更新して、より多くの結果を返します。
client.search(params, function (err, data) {
console.log('token success:', JSON.stringify(data, null, 2));
});
}
});