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

Tablestore:プレフィックスクエリ

最終更新日:Dec 28, 2024

プレフィックスクエリを実行して、インデックス内のデータをクエリできます。プレフィックスクエリを実行するときは、プレフィックスを指定する必要があります。

説明

プレフィックスクエリは、特定の文字列で始まるデータをクエリするために使用されます。プレフィックスクエリを実行するときは、プレフィックスを指定する必要があります。

プレフィックスクエリを使用して、Keyword、FuzzyKeyword、およびTextデータ型のデータをクエリできます。

  • Keyword:基本的なStringデータ型。このデータ型は、中規模または大規模なデータに対するプレフィックスクエリなどのあいまいクエリのパフォーマンスが低くなります。パフォーマンスはデータサイズが大きくなるにつれて低下します。

  • FuzzyKeyword:プレフィックスクエリなどのあいまいクエリ用に最適化されたデータ型。このデータ型は、任意のサイズのデータに対するプレフィックスクエリなどのあいまいクエリに対して、高くて安定したパフォーマンスを提供します。ほとんどの場合、クエリのパフォーマンスはデータサイズが大きくなっても低下しません。

  • Text:プレフィックス条件の照合に使用される列がText列の場合、列はトークン化されます。少なくとも1つのトークンに指定されたプレフィックスが含まれている場合、行はクエリ条件を満たします。トークン化の不確実性のため、ほとんどの場合、プレフィックスクエリはText型のデータのクエリには使用されません。このデータ型は互換性のためにのみサポートされています。このデータ型は慎重に使用してください。

API操作

SearchまたはParallelScan操作を呼び出し、クエリタイプをPrefixQueryに設定して、プレフィックスクエリを実行できます。

パラメーター

パラメーター

説明

query

クエリのタイプ。クエリパラメーターをPrefixQueryに設定します。

fieldName

クエリする列の名前。

prefix

プレフィックス。

プレフィックス条件の照合に使用される列がText列の場合、列はトークン化されます。少なくとも1つのトークンに指定されたプレフィックスが含まれている場合、行はクエリ条件を満たします。

getTotalCount

クエリ条件を満たす行の総数を返すかどうかを指定します。デフォルト値:false。

このパラメーターをtrueに設定すると、クエリのパフォーマンスが低下します。

weight

BM25ベースのキーワード関連性スコアを計算するために、クエリする列に割り当てる重み。このパラメーターは、全文検索シナリオで使用されます。重みが大きいほど、列のBM25ベースのキーワード関連性スコアが高くなります。このパラメーターの値は正の浮動小数点数です。

このパラメーターは、返される行の数には影響しません。ただし、このパラメーターは、クエリ結果のBM25ベースのキーワード関連性スコアに影響します。

tableName

データテーブルの名前。

indexName

検索インデックスの名前。

columnsToGet

クエリ条件を満たす各行のすべての列を返すかどうかを指定します。このパラメーターには、returnAllおよびcolumnsパラメーターを設定できます。

returnAllパラメーターのデフォルト値はfalseで、すべての列が返されるわけではないことを指定します。この場合、columnsパラメーターを使用して、返す列を指定できます。返す列を指定しない場合は、主キー列のみが返されます。

returnAllパラメーターをtrueに設定すると、すべての列が返されます。

方法

Tablestoreコンソール、Tablestore CLI、またはTablestore SDKを使用して、プレフィックスクエリを実行できます。プレフィックスクエリを実行する前に、次の準備が整っていることを確認してください。

重要

FuzzyKeyword型のデータに対してプレフィックスクエリを実行するには、Tablestore SDKのみを使用できます。

Tablestoreコンソールの使用

  1. インデックスタブに移動します。

    1. Tablestoreコンソールにログオンします。

    2. 上部のナビゲーションバーで、リソースグループとリージョンを選択します。

    3. 概要ページで、管理するインスタンスの名前をクリックするか、インスタンスのアクション列のインスタンスの管理をクリックします。

    4. インスタンスの詳細タブのテーブルタブで、データテーブルの名前をクリックするか、データテーブルのアクション列のインデックスをクリックします。

  2. インデックスタブで、データのクエリに使用する検索インデックスを見つけ、アクション列のデータの管理をクリックします。

  3. 検索ダイアログボックスで、クエリ条件を指定します。

    1. デフォルトでは、システムはすべての属性列を返します。特定の属性列を返すには、すべての列をオフにして、返す属性列を指定します。複数の属性列はコンマ(,)で区切ります。

      説明

      デフォルトでは、システムはデータテーブルのすべての主キー列を返します。

    2. ビジネス要件に基づいて、AndOr、またはNot論理演算子を選択します。

      And論理演算子を選択すると、クエリ条件を満たすデータが返されます。Or演算子を選択して単一のクエリ条件を指定すると、クエリ条件を満たすデータが返されます。Or論理演算子を選択して複数のクエリ条件を指定すると、クエリ条件のいずれかを満たすデータが返されます。Not論理演算子を選択すると、クエリ条件を満たさないデータが返されます。

    3. フィールドを選択し、追加をクリックします。

    4. クエリタイプパラメーターをPrefixquery(prefixquery)に設定し、クエリする値を入力します。

    5. デフォルトでは、並べ替え機能は無効になっています。特定のフィールドに基づいてクエリ結果を並べ替える場合は、並べ替えをオンにして、クエリ結果を並べ替えるフィールドと並べ替え順序を指定します。

    6. デフォルトでは、集計機能は無効になっています。特定のフィールドの統計を収集する場合は、統計を収集をオンにして、統計を収集するフィールドを指定し、統計を収集するために必要な情報を設定します。

  4. OKをクリックします。

    クエリ条件を満たすデータが、インデックスタブに指定された順序で表示されます。

Tablestore CLIの使用

Tablestore CLIを使用してsearchコマンドを実行し、検索インデックスを使用してデータをクエリできます。詳細については、検索インデックスを参照してください。

重要

Tablestore CLIを使用して、Keyword型のデータに対してのみプレフィックスクエリを実行できます。FuzzyKeyword型のデータに対しては実行できません。

  1. searchコマンドを実行して、search_index検索インデックスを使用してデータをクエリし、クエリ条件を満たす各行のすべてのインデックス付き列を返します。

    search -n search_index --return_all_indexed
  2. システムのプロンプトに従ってクエリ条件を入力します。

    {
        "Offset": -1,
        "Limit": 10,
        "Collapse": null,
        "Sort": null,
        "GetTotalCount": true,
        "Token": null,
        "Query": {
            "Name": "PrefixQuery", // クエリタイプをPrefixQueryに設定します。
            "Query": {
                "FieldName": "col_keyword", // クエリ対象のフィールド名
                "Prefix": "hangzhou" // プレフィックス
            }
        }
    }

Tablestore SDKの使用

次のTablestore SDKを使用してプレフィックスクエリを実行できます。Tablestore SDK for JavaTablestore SDK for GoTablestore SDK for PythonTablestore SDK for Node.jsTablestore SDK for .NETTablestore SDK for PHP。この例では、Tablestore SDK for Javaを使用します。

説明

Keyword型のデータに対するワイルドカードクエリのクエリステートメントは、FuzzyKeyword型のデータに対するワイルドカードクエリのクエリステートメントと同じです。ただし、クエリするフィールドの型は異なります。

次のサンプルコードは、テーブル内のCol_Keyword列の値にプレフィックス「hangzhou」が含まれる行をクエリする方法の例を示しています。

/**
 * Col_Keywordの値にプレフィックス"hangzhou"が含まれる行をテーブルで検索します。
 * @param client
 */
private static void prefixQuery(SyncClient client) {
    SearchQuery searchQuery = new SearchQuery();
    PrefixQuery prefixQuery = new PrefixQuery(); // クエリタイプをPrefixQueryに設定します。
    searchQuery.setGetTotalCount(true);
    prefixQuery.setFieldName("Col_Keyword"); // 検索対象のフィールド名
    prefixQuery.setPrefix("hangzhou"); // プレフィックス
    searchQuery.setQuery(prefixQuery);
    //searchQuery.setGetTotalCount(true); // 一致する行の総数が返されるように指定します。

    SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
    // columnsToGetパラメーターを設定して、返す列を指定するか、すべての列を返すように指定できます。このパラメーターを設定しない場合、主キー列のみが返されます。
    //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
    //columnsToGet.setReturnAll(true); // すべての列が返されるように指定します。
    //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // 返す列を指定します。
    //searchRequest.setColumnsToGet(columnsToGet);

    SearchResponse resp = client.search(searchRequest);
    //System.out.println("TotalCount: " + resp.getTotalCount()); // 返される行数ではなく、一致する行の総数が表示されるように指定します。
    System.out.println("Row: " + resp.getRows());
}

課金ルール

検索インデックスを使用してデータをクエリする場合、消費される読み取りスループットに対して課金されます。詳細については、検索インデックスの課金対象項目を参照してください。

FAQ

参考資料

```cpp // This function demonstrates how to perform a prefix query on a table. // この関数は、テーブルでプレフィックスクエリを実行する方法を示しています。 void PrefixQuery(const std::string& tableName, const std::string& indexName, const std::string& fieldName, const std::string& prefix) { // Create a search query. // 検索クエリを作成します。 Ots::SearchQuery searchQuery; // Create a prefix query. // プレフィックスクエリを作成します。 Ots::PrefixQuery prefixQuery; prefixQuery.setFieldName(fieldName); prefixQuery.setPrefix(prefix); // Set the query type to prefix query. // クエリタイプをプレフィックスクエリに設定します。 searchQuery.setQuery(prefixQuery); // Create a search request. // 検索リクエストを作成します。 Ots::SearchRequest searchRequest(tableName, indexName, searchQuery); // Send the search request and get the response. // 検索リクエストを送信し、レスポンスを取得します。 auto searchResponse = client->search(searchRequest); // Print the query results. // クエリ結果を出力します。 std::cout << "Prefix query results:" << std::endl; for (const auto& row : searchResponse.rows) { for (const auto& column : row.primary_key) { std::cout << column.name << ": " << column.value << ", "; } std::cout << std::endl; } } ```