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

Tablestore:Exists クエリ

最終更新日:Dec 28, 2024

Exists クエリは、NULL クエリまたは NULL 値クエリとも呼ばれます。このクエリは、スパースデータで使用され、行の列が存在するかどうかを判断します。たとえば、住所列の値が空でない行をクエリできます。

説明
  • Nested 列に対して Exists クエリを実行する場合は、ネストクエリを使用できます。

  • 列に空の値が含まれているかどうかを確認するには、ExistsQuery を BoolQuery の mustNotQueries と共に使用する必要があります。

  • 次のいずれかの条件が満たされている場合、システムは列が存在しないと見なします。この例では、city 列が使用されています。

    • 検索インデックス内の city 列のタイプが、keyword などの基本タイプである場合。データテーブルに city 列が存在しない行がある場合、検索インデックスは city 列が存在しないと見なします。

    • 検索インデックス内の city 列のタイプが、keyword などの基本タイプである場合。データテーブル内の city 列の値が空の配列である行("city" = "[]")がある場合、検索インデックスは city 列が存在しないと見なします。

API 操作

Search または ParallelScan 操作を呼び出し、クエリタイプを ExistsQuery に設定して、Exists クエリを実行できます。

パラメーター

パラメーター

説明

fieldName

クエリ対象の列の名前。

query

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

getTotalCount

クエリ条件を満たす行の総数を返すかどうかを指定します。このパラメーターのデフォルト値は false で、クエリ条件を満たす行の総数は返されません。

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

tableName

データテーブルの名前。

indexName

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

columnsToGet

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

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

returnAll フィールドを true に設定すると、すべての列が返されます。

メソッド

Tablestore コンソールで、または Tablestore CLI または Tablestore SDK を使用して、Exists クエリを実行できます。Exists クエリを実行する前に、次の準備が完了していることを確認してください。

Tablestore コンソールの使用

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

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

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

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

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

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

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

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

      説明

      デフォルトでは、データテーブルのすべてのプライマリキー列が返されます。

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

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

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

    4. [クエリタイプ] パラメーターを ExistsQuery(ExistsQuery) に設定します。

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

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

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

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

Tablestore CLI の使用

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

  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": "ExistsQuery", // ExistsQuery を指定
            "Query": {
                "FieldName": "col_keyword"
            }
        }
    }

Tablestore SDK の使用

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

次のサンプルコードは、指定された列が空でないすべての行をクエリする方法の例を示しています。

public static void existQuery(SyncClient syncClient) {
    // col_keyword フィールドが存在するかどうかをクエリします。col_keyword フィールドは Nested フィールドではありません。
    {
        {
            // 次のサンプルコードは、Nested タイプではないフィールドが存在するかどうかをクエリする方法の例を示しています。
            SearchQuery searchQuery = new SearchQuery();
            ExistsQuery existQuery = new ExistsQuery(); // クエリタイプを ExistsQuery に設定します。
            existQuery.setFieldName("col_keyword");
            searchQuery.setQuery(existQuery);
            SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
            SearchResponse resp = syncClient.search(searchRequest);
        }
        {
            // ビルダーを構築します。
            SearchResponse resp = syncClient.search(SearchRequest.newBuilder()
                    .indexName("<SEARCH_INDEX_NAME>")
                    .tableName("<TABLE_NAME>")
                    .searchQuery(
                            SearchQuery.newBuilder()
                                    .query(QueryBuilders.exists("col_keyword")) // exists クエリを構築
                                    .limit(10)
                                    .build())
                    .build());
        }
    }
    // Nested 構造は [{"keyword":"a","long":123}] です。
    {
        // col_nested 親フィールドが存在するかどうかをクエリします。col_nested フィールドは Nested タイプです。
        {
            SearchResponse resp = syncClient.search(SearchRequest.newBuilder()
                    .indexName("<SEARCH_INDEX_NAME>")
                    .tableName("<TABLE_NAME>")
                    .searchQuery(
                            SearchQuery.newBuilder()
                                    .query(QueryBuilders.nested()
                                            .scoreMode(ScoreMode.None)
                                            .path("col_nested")
                                            .query(QueryBuilders.exists("col_nested"))) // ネストされたフィールドの存在を確認
                                    .limit(10)
                                    .getTotalCount(false)
                                    .build())
                    .build());
        }
        // col_nested.keyword フィールドが存在するかどうかをクエリします。col_nested.keyword フィールドは Nested タイプです。
        {
            SearchResponse resp = syncClient.search(SearchRequest.newBuilder()
                    .indexName("<SEARCH_INDEX_NAME>")
                    .tableName("<TABLE_NAME>")
                    .searchQuery(
                            SearchQuery.newBuilder()
                                    .query(QueryBuilders.nested()
                                            .scoreMode(ScoreMode.None)
                                            .path("col_nested")
                                            .query(QueryBuilders.exists("col_nested.keyword"))) // ネストされたフィールド内のフィールドの存在を確認
                                    .limit(10)
                                    .getTotalCount(false)
                                    .build())
                    .build());
        }
    }
}

課金ルール

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

FAQ

参考資料

```java // 指定されたフィールドを持つドキュメントが存在するかどうかを確認します。 BoolQuery bq = new BoolQuery(); ExistsQuery eq = new ExistsQuery(); eq.setFieldName("address"); // フィールド名を指定します。 bq.setMustQueries(Collections.singletonList(eq)); SearchQuery searchQuery = new SearchQuery(); searchQuery.setQuery(bq); SearchRequest searchRequest = new SearchRequest(tableName, indexName, searchQuery); SearchResponse searchResponse = client.search(searchRequest); ```