如何在Elasticsearch SQL中结合使用地理范围查询与匹配查询?
Elasticsearch SQL 联合名称匹配与地理范围筛选
要同时实现名称匹配“abc”和地理范围筛选,直接在SQL中用AND连接两个条件即可,Elasticsearch SQL支持全文匹配函数MATCH和地理空间函数的组合使用,以下是两种常见场景的示例:
场景1:筛选边界框内的数据
如果你的地理字段是geo_point类型,要筛选某个经纬度边界框内的结果,使用GEO_BOUNDING_BOX函数:
SELECT * FROM your_index_name WHERE MATCH(name, 'abc') AND GEO_BOUNDING_BOX(location, 40.712, -74.227, 34.052, -118.243)
参数说明:
location:你的地理字段名(需为geo_point类型)- 四个数值依次是:左上角纬度、左上角经度、右下角纬度、右下角经度
场景2:筛选多边形区域内的数据
如果需要匹配自定义多边形范围,使用GEO_INTERSECTS结合GEO_POLYGON构造区域:
SELECT * FROM your_index_name WHERE MATCH(name, 'abc') AND GEO_INTERSECTS(location, GEO_POLYGON('POLYGON((-73.985 40.748, -73.985 40.738, -73.975 40.738, -73.975 40.748, -73.985 40.748))'))
参数说明:
GEO_POLYGON内的字符串是WKT格式的多边形坐标,需遵循闭合多边形规则(首尾坐标一致)- 坐标格式为
经度 纬度,多个坐标对用逗号分隔
注意事项
- 确保你的地理字段已经映射为
geo_point或geo_shape类型,否则地理函数无法生效 - 如果需要更精确的全文匹配(比如短语匹配),可以把
MATCH(name, 'abc')改成MATCH(name, '"abc"')(用双引号包裹实现短语匹配) - 替换
your_index_name为你实际的索引名称
内容的提问来源于stack exchange,提问作者Saloni Khandelwal
相关产品推荐
相关产品推荐

