Elasticsearch如何用Java实现geoshapes索引的geo_shape坐标点查询
Elasticsearch GeoShape包含查询Java实现
你提供的DSL作用是查询geoshapes索引中,coordinates字段存储的几何图形包含点(32.0, 34.0)的所有文档,以下是基于官方Java High Level REST Client的实现方案:
依赖配置(Maven示例)
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.17.10</version> </dependency>
依赖版本需要和你部署的Elasticsearch服务主版本保持一致,避免兼容性问题。
核心查询代码
import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.geo.ShapeRelation; import org.elasticsearch.geometry.Point; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; public class GeoShapeQueryExample { public List<Map<String, Object>> queryContainsPoint(RestHighLevelClient esClient) throws IOException { // 构造查询请求,指定目标索引 SearchRequest request = new SearchRequest("geoshapes"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 构造与DSL对应的布尔查询 BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); boolQuery.must(QueryBuilders.matchAllQuery()); // 构造geo_shape过滤条件 Point targetPoint = new Point(32.0, 34.0); boolQuery.filter(QueryBuilders.geoShapeQuery("coordinates", targetPoint) .relation(ShapeRelation.CONTAINS)); sourceBuilder.query(boolQuery); // 可按需调整返回结果数量,默认仅返回10条 sourceBuilder.size(100); request.source(sourceBuilder); // 执行查询并解析结果 SearchResponse response = esClient.search(request, RequestOptions.DEFAULT); List<Map<String, Object>> result = new ArrayList<>(); for (SearchHit hit : response.getHits().getHits()) { result.add(hit.getSourceAsMap()); } return result; } }
注意事项
- 需提前确保
geoshapes索引的coordinates字段类型为geo_shape,否则查询会报错 - Elasticsearch默认坐标顺序为[经度, 纬度],如果你的业务字段坐标存储顺序相反,需要调整传入Point的参数顺序
RestHighLevelClient建议全局单例初始化,不要每次查询都新建和关闭实例,避免性能损耗- 如果使用Elasticsearch 8.x版本,官方推荐使用新的Java Client,核心查询逻辑基本一致,仅API调用方式有小幅调整
内容的提问来源于stack exchange,提问作者Azazil
相关产品推荐
相关产品推荐

