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

Tablestore:地理距離クエリ

最終更新日:Dec 28, 2024

地理距離クエリを使用すると、中心点と半径で構成される円形の地理的エリアをクエリ条件として指定できます。Tablestoreは、指定された列の値が地理的円形エリア内にある行を返します。

API操作

クエリタイプをGeoDistanceQueryに設定することで、Search操作またはParallelScan操作で地理距離クエリを実行できます。

パラメータ

パラメータ

説明

fieldName

クエリ対象の列の名前。このパラメータの値はGEOPOINTデータ型です。

centerPoint

中心点の座標ペア。座標ペアは緯度と経度の値で構成されます。

このパラメータ値は、latitude,longitudeの形式である必要があります。緯度の有効な値:[-90,+90]。経度の有効な値:[-180,+180]。例:35.8,-45.91

distanceInMeter

円形地理的エリアの半径。このパラメータの値はDOUBLEデータ型です。単位:メートル。

getTotalCount

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

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

query

検索インデックスのクエリステートメント。このパラメータをGeoDistanceQueryに設定します。

tableName

データテーブルの名前。

indexName

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

columnsToGet

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

returnAllフィールドのデフォルト値はfalseで、すべての列が返されるわけではありません。この場合、columnsフィールドを使用して、返す列を指定できます。返す列を指定しない場合は、主キー列のみが返されます。

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

メソッド

Tablestoreコンソール、Tablestore CLI、およびTablestore SDKを使用して、地理距離クエリを実行できます。地理距離クエリを実行する前に、次の前提条件が満たされていることを確認してください。

Tablestoreコンソールの使用

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

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

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

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

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

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

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

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

      説明

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

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

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

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

    4. インデックスフィールドのクエリタイプをGeoDistanceQueryに設定し、中心点の座標ペアを入力して選択し、距離を入力します。

      複数の中心点の座標ペアを入力する場合は、前の操作を繰り返します。

    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": "GeoDistanceQuery",
            "Query": {
                "FieldName": "col_geopoint", // クエリ対象のフィールド名
                "CenterPoint": "35.8,-45.91", // 中心点の座標
                "DistanceInMeter": 100.0 // 中心点からの距離(メートル)
            }
        }
    }

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を使用して、地理距離クエリを実行する方法について説明します。

次のサンプルコードは、Col_GeoPoint列の値が中心点から特定の距離内にある行をクエリする方法の例を示しています。

public static void geoDistanceQuery(SyncClient client) {
    SearchQuery searchQuery = new SearchQuery();
    GeoDistanceQuery geoDistanceQuery = new GeoDistanceQuery();  // GeoDistanceQueryを使用します。
    geoDistanceQuery.setFieldName("Col_GeoPoint");
    geoDistanceQuery.setCenterPoint("5,5"); // 中心点の座標を指定します。
    geoDistanceQuery.setDistanceInMeter(10000); // 中心点からの距離を10,000以上に設定します。単位:メートル。
    searchQuery.setQuery(geoDistanceQuery);
    //searchQuery.setGetTotalCount(true); // GetTotalCountパラメータを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

参考資料