地理位置情報クエリは、地理的距離クエリ、地理的境界ボックスクエリ、地理的多角形クエリの3つのタイプに分類されます。
前提条件
OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。詳細については、データテーブルの作成とデータの書き込みを参照してください。
データテーブルの検索インデックスが作成されていること。詳細については、検索インデックスの作成を参照してください。
地理的距離クエリ
地理的距離クエリを実行するには、中心点と半径を使用して円形の地理的エリアを指定します。 Tablestore は、特定の列の値が円形の地理的エリア内にある行を返します。
パラメータ
パラメータ
説明
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 に設定すると、すべての列が返されます。
例
次のサンプルコードは、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()); }
地理的境界ボックスクエリ
地理的境界ボックスクエリを実行するには、左上隅と右下隅を使用して矩形の地理的エリアを指定します。 Tablestore は、特定の列の値が矩形の地理的エリア内にある行を返します。
パラメータ
パラメータ
説明
fieldName
クエリ対象の列の名前。このパラメータの値は GEOPOINT データ型です。
topLeft
矩形地理領域の左上隅の座標ペア。
bottomRight
矩形地理領域の右下隅の座標ペア。矩形地理領域は、左上隅と右下隅を使用して指定できます。
形式は
latitude,longitude
です。緯度の有効な値:[-90,+90]
。経度の有効な値:[-180,+180]
。例:35.8,-45.91
。query
検索インデックスのクエリステートメント。このパラメータを GeoBoundingBoxQuery に設定します。
getTotalCount
クエリ条件を満たす行の総数を返すかどうかを指定します。このパラメータのデフォルト値は false で、クエリ条件を満たす行の総数は返されません。
このパラメータを true に設定すると、クエリのパフォーマンスが低下します。
tableName
データテーブルの名前。
indexName
検索インデックスの名前。
columnsToGet
クエリ条件を満たす各行のすべての列を返すかどうかを指定します。このパラメータには、returnAll フィールドと columns フィールドを指定できます。
returnAll フィールドのデフォルト値は false で、すべての列が返されるわけではないことを指定します。この場合、columns フィールドを使用して、返す列を指定できます。返す列を指定しない場合は、主キー列のみが返されます。
returnAll フィールドを true に設定すると、すべての列が返されます。
例
次のサンプルコードは、Col_GeoPoint 列の値が「10,0」の左上隅と「0,10」の右下隅で定義された矩形地理領域内にある行をクエリする方法の例を示しています。
public static void geoBoundingBoxQuery(SyncClient client) { SearchQuery searchQuery = new SearchQuery(); GeoBoundingBoxQuery geoBoundingBoxQuery = new GeoBoundingBoxQuery(); // GeoBoundingBoxQuery を使用します。 geoBoundingBoxQuery.setFieldName("Col_GeoPoint"); // クエリ対象の列の名前を指定します。 geoBoundingBoxQuery.setTopLeft("10,0"); // 矩形地理領域の左上隅の座標を指定します。 geoBoundingBoxQuery.setBottomRight("0,10"); // 矩形地理領域の右下隅の座標を指定します。 searchQuery.setQuery(geoBoundingBoxQuery); //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()); }
地理的多角形クエリ
地理的多角形クエリを実行するには、複数点の座標ペアを使用して多角形の地理的エリアを指定します。 Tablestore は、特定の列の値が多角形の地理的エリア内にある行を返します。
パラメータ
パラメータ
説明
fieldName
クエリ対象の列の名前。このパラメータの値は GEOPOINT データ型です。
points
多角形地理領域を定義する点の座標ペア。
このパラメータ値は、
latitude,longitude
の形式である必要があります。緯度の有効な値:[-90,+90]
。経度の有効な値:[-180,+180]
。例:35.8,-45.91
。query
検索インデックスのクエリステートメント。このパラメータを GeoPolygonQuery に設定します。
getTotalCount
クエリ条件を満たす行の総数を返すかどうかを指定します。このパラメータのデフォルト値は false で、クエリ条件を満たす行の総数は返されません。
このパラメータを true に設定すると、クエリのパフォーマンスが低下します。
tableName
データテーブルの名前。
indexName
検索インデックスの名前。
columnsToGet
クエリ条件を満たす各行のすべての列を返すかどうかを指定します。このパラメータには、returnAll フィールドと columns フィールドを指定できます。
returnAll フィールドのデフォルト値は false で、すべての列が返されるわけではないことを指定します。この場合、columns フィールドを使用して、返す列を指定できます。返す列を指定しない場合は、主キー列のみが返されます。
returnAll フィールドを true に設定すると、すべての列が返されます。
例
次のサンプルコードは、Col_GeoPoint 列の値が指定された多角形地理領域内にある行をクエリする方法の例を示しています。
public static void geoPolygonQuery(SyncClient client) { SearchQuery searchQuery = new SearchQuery(); GeoPolygonQuery geoPolygonQuery = new GeoPolygonQuery(); // GeoPolygonQuery を使用します。 geoPolygonQuery.setFieldName("Col_GeoPoint"); geoPolygonQuery.setPoints(Arrays.asList("0,0","5,5","5,0")); // 多角形地理領域の頂点の座標を指定します。 searchQuery.setQuery(geoPolygonQuery); //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
参考資料
検索インデックスを使用してデータをクエリする場合、次のクエリメソッドを使用できます:用語クエリ、複数用語クエリ、すべて一致クエリ、一致クエリ、一致フレーズクエリ、プレフィックスクエリ、範囲クエリ、ワイルドカードクエリ、地理位置情報クエリ、KNNベクトル検索クエリ、ブールクエリ、ネストされたクエリ、存在クエリ。検索インデックスを作成した後、検索インデックスが提供するクエリメソッドを使用して、ビジネス要件に基づいて複数のディメンションからデータをクエリできます。
ソート機能とページング機能を使用して、クエリ条件を満たす行をソートまたはページングできます。詳細については、ソートとページングの実行を参照してください。
折りたたみ(重複排除)機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。これにより、指定されたタイプのデータはクエリ結果に1回だけ表示されます。詳細については、折りたたみ(重複排除)を参照してください。
テーブル内のデータを分析する場合、Search 操作を呼び出して集計機能を使用するか、SQL クエリ機能を使用できます。たとえば、最大値と最小値、値の合計、行数をクエリできます。詳細については、集計とSQL クエリを参照してください。
行をソートする必要なく、クエリ条件を満たすすべての行を取得する場合、ParallelScan 操作と ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、並列スキャンを参照してください。