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提供的地理范围功能更加灵活,它支持灵活多变的多边形内数据查询,使用该查询需要提供多边形所有顶点的坐标。

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 基于地理位置的搜索查询相关推荐

  1. 微信lbs开发 php,【LBS】基于地理位置的搜索之微信 附近的人 简单实现

    缘由 本周技术群有一个同学说我们该怎么实现 由近到远的基于地理位置的搜索,我创业做电商的系统做过类似这样的服务,我把我们以前的操作给大家分享下 什么是LBS LBS 全称是 Location  Bas ...

  2. ElasticSearch之基于地理位置的搜索

    在某些时候,我们希望搜索到某个区域内的特定目标建筑物,或者说要查询某个城市某个区内的楼盘等,诸如此类的需求,还有我们看到的在百度地图或者高德地图上,在某个区域内显示出我们关心的数据,都可以算是一种基于 ...

  3. Elasticsearch基于地理位置查询 geo_point

    我们可能会遇到根据当前所在的位置,找到自己身边的符合条件的一些商店,酒店之类的.它主要支持两种类型的地理查询:一种是地理点(geo_point),即经纬度查询,另一种是地理形状查询(geo_shape ...

  4. elasticsearch基于smartcn中文分词查询

    在es的主页,我们新建索引film2...... 然后映射的时候,指定smartcn分词: post http://192.168.19.128:9200/film2/_mapping/dongzuo ...

  5. ElasticSearch-Hadoop:从Hadoop到ElasticSearch索引产品视图计数和客户顶部搜索查询

    这篇文章涵盖了如何使用ElasticSearch-Hadoop从Hadoop系统读取数据并在ElasticSearch中对其进行索引. 它涵盖的功能是在最近n天中为每个客户的产品浏览量计数和热门搜索查 ...

  6. ElasticSearch-Hadoop:从Hadoop到ElasticSearch的产品视图计数索引和客户顶部搜索查询...

    这篇文章涵盖了如何使用ElasticSearch-Hadoop从Hadoop系统读取数据并在ElasticSearch中对其进行索引. 它涵盖的功能是在最近n天中为每个客户的产品浏览量计数和热门搜索查 ...

  7. Elasticsearch(十)【NEST高级客户端--搜索查询】

    搜索 Search API允许您执行搜索查询并获取与查询匹配的搜索匹配. Elasticsearch的搜索功能可能是您使用它的原因之一,NEST公开了所有可用的不同类型的搜索,以及一些聪明的使用Ela ...

  8. Elasticsearch实战——地理位置查询

    Elasticsearch实战--地理位置查询 文章目录 Elasticsearch实战--地理位置查询 1. 半径查询(geo_distance query) 2. 指定矩形内的查询(geo_bou ...

  9. elasticsearch 6.2.2 搜索推荐系列(三)之高级搜索查询实现( 中文+拼音+首字母+简繁转换+特殊符号过滤)

    一.先摆需求: 1.中文搜索.英文搜索.中英混搜   如:"南京东路","cafe 南京东路店" 2.全拼搜索.首字母搜索.中文+全拼.中文+首字母混搜   如 ...

最新文章

  1. Pinging ? with 32 bytes of data 故障解决
  2. 浙大超重力离心模拟与实验装置有望年底开建 释放五大利好
  3. tomcat的server.xml详解
  4. Keep Walking!
  5. PowerDesigner如何导出建表sql脚本(转)
  6. Marketing Cloud的Contact主数据创建
  7. 如何创建 Visual Studio 2017 RC 离线安装包
  8. Java中方法中的参数传递
  9. java怎么求素数_如何用Java求素数?
  10. java 回调函数传值_说明Java的传递与回调机制的代码示例分享
  11. [竞品分析] 猿辅导-K12在线教育产品
  12. CSS 的 hsl() 和 hsla() 函数(设置颜色的方式之一)
  13. ipynb转pdf的一种较完美解决方案
  14. word文档正文页码从1开始
  15. 初中文化能学python吗_初中文化可以学Python编程吗,我想通过这个渠道进入人工智能这个大行业?...
  16. html中竖线怎么写,网页中竖线的几种做法
  17. PPT2016内嵌Excel的动态图表
  18. (完美)华为nova2 PIC-AL00的USB调试模式在哪里打开的流程
  19. 免费文案生成器-免费文案改写神器
  20. 远端WWW服务支持TRACE请求

热门文章

  1. (一百三十五)Android O探索WLAN扫描(WIFI SCAN ALWAYS)
  2. WIN 11 无法正常运行HCL 模拟器
  3. java HashMap练习题1
  4. 梅森旋转(Mersenne twister)及其他随机数生成算法
  5. 第 2 课 第二次鸦片战争(1856-1860 年) (咸丰帝在位)
  6. 【2018虚拟现实设备VR眼镜排行榜】VR眼镜哪个好?9款市面上值得推荐的VR眼镜
  7. 用openAI写个js的排序算法(快速排序算法)
  8. PP相关的 bapi
  9. Node.js: redis 和 ioredis 的基本使用
  10. 在VSCode环境下用dlv工具的attach模式远程调试在运行中的服务