使用 Tablestore Python SDK 的地理位置查询可按与中心点的距离、长方形范围或多边形范围筛选数据。
前提条件
安装Tablestore Python SDK并初始化客户端。
功能说明
地理位置查询用于按 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(可选) |
|
结果折叠配置,用于按指定字段对返回结果去重。有关配置方法,请参见折叠(去重)。 |
以下三类查询涉及的坐标均使用 纬度,经度 格式,纬度在前,经度在后。纬度范围为 [-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 |
|
查询命中结果,包含相关性评分、高亮结果和匹配子行等扩展信息。 |
兼容 Tuple 返回格式
Tablestore Python SDK 5.2.0 开始将查询接口的返回值由 Tuple 调整为响应对象,5.1.0 及以下版本直接返回 Tuple。5.2.1 及以上版本可调用 SearchResponse.v1_response() 获取与旧版本兼容的 Tuple。新代码建议直接访问 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)
查询多边形范围内的数据
以下示例查询位于四个坐标点组成的多边形范围内的数据。
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)