Elasticsearch 基于地理位置的搜索查询

这篇具有很好参考价值的文章主要介绍了Elasticsearch 基于地理位置的搜索查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

         ES为用户提供了基于地理位置的搜索功能。它主要支持两种类型的地理查询:一种是地理点(geo_point),即经纬度查询,另一种是地理形状查询(geo_shape),即支持点,线,圆形和多边形等查询。

        从实用性来说,地理点(即geo_point)数据类型的使用更多一些,对于geo_point字段类型的查询方式有三种,分别为geo_distance查询(圆形区域查询),geo_bounding_box查询(矩形区域查询)和geo_polygon查询(多边形区域查询)。

1.geo_distance圆形区域查询

geo_distance需要指定一个坐标点,在指定该点距离的范围后,ES可查询到以该点为中心,距离为半径的圆形区域的数据。

1.1 查询的DSL

GET index_school/_search
{
  "_source": [                        // 只返回部分字段
    "name",
    "latitude",
    "longitude",
    "devideNo",
    "time"
    ], 
  "query": {
    "geo_distance":{
      "distance": "5km",             // 距离范围(半径)为5km
      "location":{                   //中心点经纬度
        "lat": "18.231472",
        "lon": "109.502083"
      }
    }
  }
}

1.2 java实现

SearchRequest request = new SearchRequest(tableName);
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.filter(QueryBuilders.geoDistanceQuery("location")                //指定索引字段
.distance(inputDTO.getDistance())                                          //距离中心点范围(半径)
.point(18.231472,109.502083));                                             //中心点
request.source().query(boolQuery).size(10000).trackTotalHits(true);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);

2.geo_bounding_box矩形区域查询

geo_bounding_box查询提供的是矩形内的搜索,需要提供左上角和右下角的顶点坐标。

2.1 查询的DSL

GET index_school/_search
{
  "_source": [                        
    "name",
    "latitude",
    "longitude",
    "devideNo",
    "time"
    ], 
  "query": {
    "geo_bounding_box":{
      "location":{   
        "top_left":{                          //设置左上角顶点坐标
           "lat": "18.431472",
           "lon": "109.502083"
        },
        "bottom_right":{                      //设置右下角顶点坐标
           "lat": "18.231472",
           "lon": "109.202083"
        }
      }
    }
  }
}

2.2 java实现

SearchRequest request = new SearchRequest(tableName);
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.filter(QueryBuilders.geoBoundingBoxQuery("location")             //指定索引字段
.setCorners(inputDTO.getYMax(), inputDTO.getXMin(),                        //构造矩形
                    inputDTO.getYMin(), inputDTO.getXMax()));
request.source().query(boolQuery).size(10000).trackTotalHits(true);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);

3.geo_polygon多边形区域查询

geo_polygon比geo_bounding_box提供的地理范围功能更加灵活,它支持灵活多变的多边形内数据查询,使用该查询需要提供多边形所有顶点的坐标。文章来源地址https://www.toymoban.com/news/detail-528685.html

3.1 查询的DSL

GET index_school/_search
{
  "query": {
    "geo_polygon":{
      "location":{   
        "points":[
          {
           "lat": "20.219935",
           "lon":  "109.700590"
          },
          {
           "lat": "20.118963",
           "lon":  "109.865898"
          },
          {
           "lat": "20.148887",
           "lon":  "110.1842848"
          },
          {
           "lat": "20.355594",
           "lon":  "111.097193"
          },
          {
           "lat": "20.295775",
           "lon":  "111.791273"
          }
        ]
      }
    }
  }
}

3.2 java实现

String AREA_POINTS =
            "109.70059057645672,20.219935185668575," +
            "109.86589885747735,20.11896383759739," +
            "110.18428481460053,20.148887724639927," +
            "111.09719394252089,20.355594505110506," +
            "111.79127352756524,20.295775199436054," +
            "111.44955008175484,19.864326194135216," +
            "110.65937420024187,18.52295323361459," +
            "109.76478316052932,17.989118493905913," +
            "109.57997296428381,17.95228226006386";
SearchRequest request = new SearchRequest(tableName);
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
List<GeoPoint> points = new ArrayList<>();
String[] strings = AREA_POINTS.split(",");
for (int i = 0; i < strings.length; i = i + 2) {
    points.add(new GeoPoint(Double.valueOf(strings[i + 1]), Double.valueOf(strings[i])));
}
boolQuery.filter(QueryBuilders.geoPolygonQuery("location",points));
request.source().query(boolQuery).size(10000).trackTotalHits(true);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);

到了这里,关于Elasticsearch 基于地理位置的搜索查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • IP详细地理位置查询:技术原理与应用实践

    IP地址是互联网上设备的唯一标识,在网络安全、个性化服务等领域具有重要意义。通过IP详细地理位置查询,可以获取到IP地址所在地的具体信息,为网络管理、定位服务等提供支持。IP数据云将深入探讨IP详细地理位置查询的技术原理、应用实践以及相关的隐私安全考虑,以

    2024年02月21日
    浏览(51)
  • AI:87-基于深度学习的街景图像地理位置识别

    🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在

    2024年02月05日
    浏览(40)
  • 一种基于位置预测的无人机辅助海面自组网地理路由算法

    【摘  要】 为解决传统海上通信方式中卫星通信传输时延较长,岸基通信覆盖范围有限的问题,提出一种基于位置预测的无人机辅助海面自组网地理路由算法。所提算法采用高斯马尔科夫模型获取节点的预测位置。若遇到路由空洞,转发节点发起两跳转发过程。多因素决策考

    2024年02月03日
    浏览(54)
  • 地理空间分析12——地理位置数据隐私与安全

    在数字化时代,地理位置数据成为了众多应用程序和服务不可或缺的一部分。从导航应用到社交媒体,从广告定位到城市规划,地理位置数据的应用范围广泛。然而,这些数据的收集和使用也引发了广泛的隐私和安全担忧。本文将探讨地理位置数据隐私的挑战和重要性,并介

    2024年03月19日
    浏览(58)
  • 小程序地理位置接口申请

    申请接口理由: wx.chooseAddress 获取用户收货地址提交理由: 快速定位用户当前位置,获取省市区等地址信息,方便用户提交地址等信息 wx.chooseLocation打开地图选择位置接口提交理由: 为了方便用户能够快速的获取地址, 定位用户位置信息 wx.getLocation获取当前地理位置,速度:

    2024年02月12日
    浏览(41)
  • Unity之获取用户地理位置

    1.1 利用bilibili的api 【未知稳定性】 lua代码  1.2 利用baidu api 【配额超限,需要扩充配额,需要联系官方】 2.1 API: \\\"https://api.ipify.org\\\" 和 心知天气官网“心知天气 - 高精度气象数据 - 天气数据API接口 - 行业气象解决方案” 获取公网IP 根据IP获取地理信息和天气信息,json反解析

    2024年02月14日
    浏览(43)
  • Unity 获取手机地理位置信息

    在游戏的开发过程中,有时候会遇到需要获取玩家位置信息的需求,比如显示玩家所在的国家城市等。 有一下方法可以参考: 可以根据手机的地区和语言来做判断。 根据IP来判断所处的位置,阿里云啥的都有对应的接口服务。 根据GPS来判断。 以上方法都各有利弊吧,这里简

    2024年02月12日
    浏览(50)
  • 通过ip获取地理位置信息

    GeoLite2-City.mmdb 文件是 MaxMind 公司提供的一个免费的 IP 地址与城市地理位置映射数据库文件。它包含了 IP 地址范围与对应的城市、地区、国家、经纬度等地理位置信息的映射。这种数据库文件可以用于识别访问您的应用程序或网站的用户的地理位置,从而实现针对不同地区的

    2024年02月12日
    浏览(47)
  • 使用uniapp开发获取地理位置

    老板要求做一个微信小程序,后面又希望能转为app. 所以选择了uniapp开发. 我的体验和感想就是以后不用uniapp了. 资源不多,学习了可能用处也不大.适合外包的干.这里写一下使用uniapp开发微信小程序获取地理位置 基本逻辑是使用uniapp的api首先获得地理经纬度位置等信息(在这之前

    2024年02月07日
    浏览(50)
  • 【Redis】特殊数据类型 Geo (地理位置)

    除了五中基本的数据类型外,Redis还支持两种特殊的数据类型,第一种 Geo (地理位置):用于存储地理位置相关的数据,例如经纬度、距离等。第二种 Stream (流):是一个高级的列表类型,支持对列表的批量操作,如添加多个元素、获取多个元素等。 Redis GEO(Geo Redis)是一个用

    2024年02月15日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包