要在 Elasticsearch 中执行地理空间搜索,需要使用 Geo Query DSL。Geo Query DSL 用于定义地理空间查询和过滤器。以下是一些常见的 Geo Query DSL 查询:
- geo_distance 查询:基于给定的坐标和距离,搜索距离该坐标一定距离内的所有文档。
- geo_bounding_box 查询:搜索落在指定矩形框内的文档。
- geo_polygon 查询:搜索落在指定多边形区域内的文档。
- geo_shape 查询:搜索与指定地理形状相交的文档,如圆形、矩形、多边形等。
在 Elasticsearch 中使用地理空间搜索功能需要注意以下几点:
- 数据映射:在索引中定义正确的映射类型以支持地理空间搜索。
- 坐标格式:要使用经纬度坐标,必须在经度和纬度之间加上逗号。
- 映射更新:如果您的映射中包含旧的地理字段,您需要更新映射以使用新的地理类型。
例子:
假设我们有一个用户数据集,其中每个用户都有一个地理位置坐标(经度和纬度)。我们想要查找在给定坐标附近一定距离内的其他用户。
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "10km",
"location": {
"lat": 37.7749,
"lon": -122.4194
}
}
}
}
}
}
在上面的查询中,使用 bool 查询来组合一个 match_all 查询和一个 geo_distance 过滤器。geo_distance 过滤器指定了距离和地理位置坐标,它将返回距离该坐标一定距离内的所有文档。
在上面的示例中,我们指定了距离为 10 公里,地理位置坐标为纬度为 37.7749 和经度为 -122.4194,它将返回距离该坐标 10 公里内的所有用户文档。