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

Tablestore:Exists クエリ

最終更新日:May 07, 2026

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

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

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

  • 以下のいずれかの条件を満たす場合、システムは列が存在しないとみなします。ここでは city 列を例として説明します。

    • 多次元インデックスにおける city 列の型が keyword などの基本型であり、データテーブルに city 列が存在しない行がある場合、多次元インデックスは city 列が存在しないとみなします。

    • 検索インデックス内の city 列の型は、キーワードなどの基本型です。データテーブルで 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. Table Store コンソールにログインします。

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

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

    4. インスタンス詳細 タブの データテーブル一覧 タブで、データテーブル名をクリックするか、操作列の インデックス管理 をクリックします。

  2. [インデックス管理] タブで、対象の検索インデックスを見つけ、[検索] を [操作] 列でクリックします。

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

    1. デフォルトでは、すべての列が返されます。特定の列のみを返すには、すべての列を取得 をオフにして、カンマ区切りで列名を入力します。

      説明

      デフォルトでは、Table Store はデータテーブルのプライマリキー列を返します。

    2. 論理演算子を選択します:AndOr、または Not

      And を選択すると、すべての指定条件を満たすデータが返されます。Or を選択すると、指定条件のいずれかを満たすデータが返されます。Not を選択すると、指定条件を満たさないデータが返されます。

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

    4. インデックスフィールドのクエリタイプを Exists クエリ (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",
            "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 .NET、および Tablestore 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"))
                                    .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());
        }
    }
}

課金

多次元インデックスを使用したデータのクエリは、読み取りスループットを消費します。詳細については、「多次元インデックスのメータリングと課金」をご参照ください。

よくある質問

関連ドキュメント