Geo クエリは、geo 距離クエリ、geo バウンディングボックス クエリ、geo ポリゴンクエリの 3 つのタイプに分類されます。
前提条件
OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。詳細については、データテーブルの作成とデータの書き込みを参照してください。
データテーブルの検索インデックスが作成されていること。詳細については、検索インデックスの作成を参照してください。
Geo 距離クエリ
geo 距離クエリを実行するには、中心点と半径を使用して円形の地理的エリアを指定します。 Tablestore は、特定の列の値が円形の地理的エリア内にある行を返します。
パラメーター
パラメーター
説明
FieldName
クエリ条件を満たすために使用される列の名前。このパラメーターの値は GEOPOINT データ型です。
CenterPoint
中心点の座標ペア。座標ペアは、緯度と経度の値で構成されます。
このパラメーター値は、「緯度,経度」の形式である必要があります。緯度の有効な値:[-90,90]。経度の有効な値:[-180,180]。例:「35.8,-45.91」。
DistanceInMeter
円形地理領域の半径。このパラメーターの値は DOUBLE データ型です。単位:メートル。
Query
クエリのタイプ。クエリタイプを GeoDistanceQuery に設定します。
TableName
データテーブルの名前。
IndexName
検索インデックスの名前。
サンプルコード
次のサンプルコードは、Col_GeoPoint の値が円形地理領域内にある行をクエリする方法の例を示しています。
func GeoDistanceQuery(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest.SetTableName(tableName) searchRequest.SetIndexName(indexName) query := &search.GeoDistanceQuery{} // クエリタイプを GeoDistanceQuery に設定します。 query.FieldName = "Col_GeoPoint" query.CenterPoint = "5,5" // 中心点の座標ペアを指定します。 query.DistanceInMeter = 10000.0 // 円形地理領域の半径を 10,000 に設定します。単位:メートル。 searchQuery := search.NewSearchQuery() searchQuery.SetQuery(query) searchRequest.SetSearchQuery(searchQuery) // すべての列を返します。 searchRequest.SetColumnsToGet(&tablestore.ColumnsToGet{ ReturnAll:true, }) searchResponse, err := client.Search(searchRequest) if err != nil { fmt.Printf("%#v", err) return } fmt.Println("IsAllSuccess: ", searchResponse.IsAllSuccess) // クエリ条件を満たすすべての行が返されたかどうかを確認します。 fmt.Println("TotalCount: ", searchResponse.TotalCount) // 返された行数ではなく、クエリ条件を満たす行の総数を表示します。 fmt.Println("RowCount: ", len(searchResponse.Rows)) for _, row := range searchResponse.Rows { jsonBody, err := json.Marshal(row) if err != nil { panic(err) } fmt.Println("Row: ", string(jsonBody)) } }
Geo バウンディングボックス クエリ
geo バウンディングボックス クエリを実行するには、左上隅と右下隅を使用して矩形の地理的エリアを指定します。 Tablestore は、特定の列の値が矩形の地理的エリア内にある行を返します。
パラメーター
パラメーター
説明
FieldName
クエリ条件を満たすために使用される列の名前。このパラメーターの値は GEOPOINT データ型です。
TopLeft
矩形地理領域の左上隅の座標ペア。
BottomRight
矩形地理領域の右下隅の座標ペア。左上隅と右下隅の座標ペアは、一意の矩形地理領域を定義します。
このパラメーター値は、「緯度,経度」の形式である必要があります。緯度の有効な値:[-90,90]。経度の有効な値:[-180,180]。例:「35.8,-45.91」。
Query
クエリのタイプ。クエリタイプを GeoBoundingBoxQuery に設定します。
TableName
データテーブルの名前。
IndexName
検索インデックスの名前。
サンプルコード
次のサンプルコードは、Col_GeoPoint の値が、左上隅が「10,0」で右下隅が「0,10」である矩形地理領域内にある行をクエリする方法の例を示しています。
func GeoBoundingBoxQuery(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest.SetTableName(tableName) searchRequest.SetIndexName(indexName) query := &search.GeoBoundingBoxQuery{} // クエリタイプを GeoBoundingBoxQuery に設定します。 query.FieldName = "Col_GeoPoint" // クエリする列の名前を指定します。 query.TopLeft = "10,0" // 矩形地理領域の左上隅の座標ペアを指定します。 query.BottomRight = "0,10" // 矩形地理領域の右下隅の座標ペアを指定します。 searchQuery := search.NewSearchQuery() searchQuery.SetQuery(query) searchRequest.SetSearchQuery(searchQuery) // クエリ条件を満たす行のすべての列を返します。 searchRequest.SetColumnsToGet(&tablestore.ColumnsToGet{ ReturnAll:true, }) searchResponse, err := client.Search(searchRequest) if err != nil { fmt.Printf("%#v", err) return } fmt.Println("IsAllSuccess: ", searchResponse.IsAllSuccess) // クエリ条件を満たすすべての行が返されたかどうかを確認します。 fmt.Println("TotalCount: ", searchResponse.TotalCount) // 返された行数ではなく、クエリ条件を満たす行の総数を表示します。 fmt.Println("RowCount: ", len(searchResponse.Rows)) for _, row := range searchResponse.Rows { jsonBody, err := json.Marshal(row) if err != nil { panic(err) } fmt.Println("Row: ", string(jsonBody)) } }
Geo ポリゴンクエリ
geo ポリゴンクエリを実行するには、複数の点の座標ペアを使用してポリゴン地理領域を指定します。 Tablestore は、特定の列の値がポリゴン地理的エリア内にある行を返します。
パラメーター
パラメーター
説明
FieldName
クエリ条件を満たすために使用される列の名前。このパラメーターの値は GEOPOINT データ型です。
Points
ポリゴン地理領域を定義する点の座標ペア。
各点の座標ペアは、「緯度,経度」の形式である必要があります。緯度の有効な値:[-90,90]。経度の有効な値:[-180,180]。例:「35.8,-45.91」。
Query
クエリのタイプ。クエリタイプを GeoPolygonQuery に設定します。
TableName
データテーブルの名前。
IndexName
検索インデックスの名前。
サンプルコード
次のサンプルコードは、Col_GeoPoint の値がポリゴン地理領域内にある行をクエリする方法の例を示しています。
func GeoPolygonQuery(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest.SetTableName(tableName) searchRequest.SetIndexName(indexName) query := &search.GeoPolygonQuery{} // クエリタイプを GeoDistanceQuery に設定します。 query.FieldName = "Col_GeoPoint" query.Points = []string{"0,0","5,5","5,0"} // ポリゴン地理領域の頂点の座標ペアを指定します。 searchQuery := search.NewSearchQuery() searchQuery.SetQuery(query) searchRequest.SetSearchQuery(searchQuery) // クエリ条件を満たす行のすべての列を返します。 searchRequest.SetColumnsToGet(&tablestore.ColumnsToGet{ ReturnAll:true, }) searchResponse, err := client.Search(searchRequest) if err != nil { fmt.Printf("%#v", err) return } fmt.Println("IsAllSuccess: ", searchResponse.IsAllSuccess) // クエリ条件を満たすすべての行が返されたかどうかを確認します。 fmt.Println("TotalCount: ", searchResponse.TotalCount) // 返された行数ではなく、クエリ条件を満たす行の総数を表示します。 fmt.Println("RowCount: ", len(searchResponse.Rows)) for _, row := range searchResponse.Rows { jsonBody, err := json.Marshal(row) if err != nil { panic(err) } fmt.Println("Row: ", string(jsonBody)) } }
FAQ
参考資料
検索インデックスを使用してデータをクエリする場合、次のクエリメソッドを使用できます:タームクエリ、タームズクエリ、マッチオールクエリ、マッチクエリ、マッチフレーズクエリ、プレフィックスクエリ、範囲クエリ、ワイルドカードクエリ、geo クエリ、ブールクエリ、KNNベクトル検索、ネストされたクエリ、存在クエリ。検索インデックスによって提供されるクエリメソッドを使用して、ビジネス要件に基づいて複数のディメンションからデータをクエリできます。
ソート機能とページング機能を使用して、クエリ条件を満たす行をソートまたはページングできます。詳細については、ソートとページングを参照してください。
折りたたみ(重複排除)機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。このようにして、指定されたタイプのデータはクエリ結果に一度だけ表示されます。詳細については、折りたたみ(重複排除)を参照してください。
データテーブルのデータを分析する場合、Search 操作の集計機能を使用するか、SQL ステートメントを実行できます。たとえば、最小値、最大値、合計、行の総数などを取得できます。詳細については、集計とSQL クエリを参照してください。
行をソートする必要なく、クエリ条件を満たすすべての行を取得する場合、ParallelScan 操作と ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、並列スキャンの実行を参照してください。