Tablestore SDK for Python を使用して、中心点からの距離、バウンディングボックス、またはポリゴンによってデータをフィルターします。
前提条件
Tablestore SDK for Python をインストールし、クライアントを初期化してください。
説明
geo クエリは、GeoPoint フィールド内の地理的位置に基づいてデータをフィルターします。距離、バウンディングボックス、またはポリゴンでクエリを実行できます。search メソッドを呼び出すとき、必要な地理的範囲に基づいてクエリタイプを GeoDistanceQuery、GeoBoundingBoxQuery、または GeoPolygonQuery に設定します。
GeoDistanceQuery(field_name, center_point, distance)
GeoBoundingBoxQuery(field_name, top_left, bottom_right)
GeoPolygonQuery(field_name, points)
次の例では、location フィールドが 30.25,120.16 から 200,000 メートル以内にある行をクエリし、最大 10 行と一致する行の総数を返します。
query = GeoDistanceQuery("location", "30.25,120.16", 200000)
search_query = SearchQuery(
query,
limit=10,
get_total_count=True,
)
response = client.search(
"example_table",
"example_index",
search_query,
ColumnsToGet(return_type=ColumnReturnType.ALL),
)
print(response.total_count)
for row in response.rows:
print(row)
パラメーター
検索リクエスト
search メソッドには、次のパラメーターが含まれます。
|
名前 |
型 |
説明 |
|
table_name (必須) |
|
データテーブルの名前。 |
|
index_name (必須) |
|
検索インデックスの名前。 |
|
search_query (必須) |
|
クエリ条件と共通のクエリ設定。 |
|
columns_to_get (任意) |
|
返す列の設定。このパラメーターが指定されていない場合、プライマリキー列のみが返されます。 |
|
routing_keys (任意) |
|
カスタムルーティングフィールドのプライマリキー値のリスト。カスタムルーティングが設定されていない場合、このパラメーターを指定する必要はありません。 |
|
timeout_s (任意) |
|
リクエストのタイムアウト (秒単位) 。このパラメーターが指定されていない場合、クライアントレベルのタイムアウトが使用されます。 |
クエリ設定
search_query は SearchQuery 型で、次のパラメーターが含まれます。
|
名前 |
型 |
説明 |
|
query (必須) |
|
クエリ条件。クエリ オブジェクト ( |
|
sort (任意) |
|
クエリ結果のソート順。詳細については、「結果のソートとページ分割」をご参照ください。 |
|
get_total_count (任意) |
|
一致する行の総数を返すかどうかを指定します。デフォルト値: |
|
next_token (任意) |
|
ページネーショントークン。次のページを取得するには、このパラメーターを前のレスポンスの |
|
offset (任意) |
|
現在のクエリが開始するオフセット。このパラメーターを浅いページネーションに使用します。 |
|
limit (任意) |
|
返す行の最大数。このパラメーターが |
|
aggs (任意) |
|
集計設定。詳細については、「集計」をご参照ください。 |
|
group_bys (任意) |
|
グループ化設定。詳細については、「集計」をご参照ください。 |
|
collapse_field (任意) |
|
指定されたフィールドに基づいて重複する結果を削除する、結果の折りたたみ設定。詳細については、「クエリ結果の折りたたみ」をご参照ください。 |
3 つすべてのクエリタイプで、座標は 緯度,経度 形式を使用します。緯度、経度の順で記述します。緯度の範囲は [-90,+90] で、経度の範囲は [-180,+180] です。例:35.8,-45.91。
地理距離条件
search_query.query は GeoDistanceQuery 型で、次のパラメーターが含まれます。
|
名前 |
型 |
説明 |
|
field_name (必須) |
|
クエリ対象の |
|
center_point (必須) |
|
中心点の座標。 |
|
distance (必須) |
|
中心点からの最大距離。単位:メートル。 |
地理バウンディングボックス条件
search_query.query は GeoBoundingBoxQuery 型で、次のパラメーターが含まれます。
|
名前 |
型 |
説明 |
|
field_name (必須) |
|
クエリ対象の |
|
top_left (必須) |
|
左上隅の座標。 |
|
bottom_right (必須) |
|
右下隅の座標。 |
地理ポリゴン条件
search_query.query は GeoPolygonQuery 型で、次のパラメーターが含まれます。
|
名前 |
型 |
説明 |
|
field_name (必須) |
|
クエリ対象の |
|
points (必須) |
|
ポリゴンを形成する座標のリスト。境界の順に座標を指定します。 |
返される列
columns_to_get は ColumnsToGet 型で、次のパラメーターが含まれます。
|
名前 |
型 |
説明 |
|
column_names (任意) |
|
返す属性列の名前。このパラメーターは、 |
|
return_type (任意) |
|
返される列のモード。 |
レスポンス
search メソッドは SearchResponse を返します。次の表に、主要なフィールドを示します。
|
フィールド |
型 |
説明 |
|
rows |
|
現在のクエリによって返された行。行数は |
|
next_token |
|
次のページのトークン。このフィールドが空でない場合は、次のリクエストに渡して読み込みを続行します。 |
|
total_count |
|
一致する行の数。値は |
|
is_all_succeed |
|
すべてのインデックスパーティションがクエリされたかどうかを示します。値が |
|
agg_results |
|
集計結果。 |
|
group_by_results |
|
グループ化の結果。 |
|
search_hits |
|
関連性スコア、ハイライト、一致する子行などの拡張情報を含む検索ヒット。 |
タプル互換のレスポンス
Tablestore SDK for Python 5.2.0 以降では、検索 API はタプルの代わりにレスポンスオブジェクトを返します。バージョン 5.1.0 以前はタプルを直接返します。バージョン 5.2.1 以降では、SearchResponse.v1_response() を呼び出して、以前のバージョンと互換性のあるタプルを取得できます。新しいコードでは、レスポンスフィールドが拡張された場合のアンパックエラーを避けるために、SearchResponse 属性に直接アクセスしてください。
(
rows,
next_token,
total_count,
is_all_succeed,
agg_results,
group_by_results,
search_hits,
) = response.v1_response()
例
バウンディングボックス内のデータのクエリ
次の例では、左上隅 32.0,119.0 と右下隅 29.0,122.0 で定義されるバウンディングボックス内のデータをクエリします。
query = GeoBoundingBoxQuery(
"location",
"32.0,119.0",
"29.0,122.0",
)
response = client.search(
"example_table",
"example_index",
SearchQuery(query, limit=10),
ColumnsToGet(return_type=ColumnReturnType.ALL),
)
print(response.rows)
ポリゴン内のデータのクエリ
次の例では、4 つの座標で形成されるポリゴン内のデータをクエリします。
query = GeoPolygonQuery(
"location",
[
"29.0,119.0",
"32.0,119.0",
"32.0,122.0",
"29.0,122.0",
],
)
response = client.search(
"example_table",
"example_index",
SearchQuery(query, limit=10),
ColumnsToGet(return_type=ColumnReturnType.ALL),
)
print(response.rows)