You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 22:45:02