Elasticsearch 实现距离查询、排序和筛选
前言
在现代应用中,位置相关的查询需求越来越普遍。无论是查找附近的餐厅、计算两个地点之间的距离,还是根据用户位置进行排序和筛选,Elasticsearch 都提供了强大的地理位置查询功能。本文将介绍如何在 Elasticsearch 中实现基于距离的查询、排序和筛选。
1. 准备工作
1.1 安装和配置 Elasticsearch
首先,需要确保已经安装并配置好了 Elasticsearch。可以参考官方文档进行安装配置。安装完成后,我们可以通过 Kibana 或者直接使用 REST API 来进行查询操作。
1.2 创建索引并映射地理位置字段
在 Elasticsearch 中,我们需要为地理位置数据定义一个 geo_point
类型的字段。假设我们有一个 locations
索引,存储了各个地点的经纬度信息:
json
PUT /locations
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
2. 实现距离查询
2.1 查询指定距离范围内的地点
我们可以使用 geo_distance
查询来查找位于特定距离范围内的地点。比如,查找距离给定经纬度 5 公里范围内的所有地点:
json
GET /locations/_search
{
"query": {
"bool": {
"filter": {
"geo_distance": {
"distance": "5km",
"location": {
"lat": 40.7128,
"lon": -74.0060
}
}
}
}
}
}
2.2 根据距离进行排序
在有多个匹配结果时,我们通常希望根据与目标位置的距离进行排序。可以通过 geo_distance
函数进行排序:
json
GET /locations/_search
{
"sort": [
{
"_geo_distance": {
"location": {
"lat": 40.7128,
"lon": -74.0060
},
"order": "asc",
"unit": "km",
"mode": "min",
"distance_type": "arc"
}
}
],
"query": {
"match_all": {}
}
}
3. 结合筛选条件的距离查询
在实际应用中,距离查询通常与其他筛选条件结合使用。以下示例展示了如何根据用户评分筛选出特定范围内的地点:
json
GET /locations/_search
{
"query": {
"bool": {
"must": [
{
"range": {
"rating": {
"gte": 4
}
}
}
],
"filter": {
"geo_distance": {
"distance": "10km",
"location": {
"lat": 40.7128,
"lon": -74.0060
}
}
}
}
},
"sort": [
{
"_geo_distance": {
"location": {
"lat": 40.7128,
"lon": -74.0060
},
"order": "asc",
"unit": "km"
}
}
]
}