ElasticSearch查询学习笔记章节5——geo_distance,geo_bounding_box,geo_polygon地图检索geo查询
ElasticSearch查询笔记目录
涉及的常用查询内容较多,将分多个章节进行笔记整理,具体如下:
- ElasticSearch查询学习笔记章节1——term,terms,match,id查询
主要是依据精准的查询条件来查询,查询速度快,也是最常用的几类查询方式,具体种类如下:
- term查询
- terms查询
- match_all查询
- match查询
- 布尔match查询
- multi_match查询
- 根据文档id查询(单个id)
- 根据文档ids查询(多个id)
- ElasticSearch查询学习笔记章节2——prefix,fuzzy,wildcard,range,regexp查询
主要是涉及ElasticSearch查询条件相对模糊,查询速度相对慢,实时查询时应尽量避免这些方式,但是这些查询方式又具有自己独特不可代替的功能,还是还有必要,具体如下:
- prefix查询
- fuzzy查询
- wildcard查询
- range查询
- regexp查询
- ElasticSearch查询学习笔记章节3——scroll,delete-by-query,bool,boosting,filter,highlight查询**
主要涉及ElasticSearch的一些常用的杂项查询;
- 深分页scroll查询
- delete-by-query
- bool查询
- boosting查询
- filter查询
- highlight(高亮)查询
- ElasticSearch查询学习笔记章节4——cardinality,range,extended_stats聚合统计aggregations查询
主要涉及ES的聚合查询Aggregations;
- cardinality(去重计数)查询
- range(范围统计)查询
- extended_stats(统计聚合)查询
- ElasticSearch查询学习笔记章节5——geo_distance,geo_bounding_box,geo_polygon地图检索geo查询
. 主要涉及ES的地图检索geo相关的查询;
- geo_distance查询
- geo_bounding_box查询
- geo_polygon查询
整体Java代码的测试用例项目
整个章节的Java代码放在CSDN资源ElasticSearch常用查询的Java实现;路径效果如下图,欢迎下载访问;
geo_point索引、数据准备
ES中特有的类型geo_point
,用来存储地图类型,某平台外卖。快递体现的配送人员距离你多少米,就是这个数据类型做出来的。
新建索引map
RESTFul风格的创建索引my_badu_map如下;
PUT /my_badu_map
{"settings": {"number_of_replicas": 3,"number_of_shards": 5}, "mappings": {"properties": {"name":{"type": "text"},"location":{"type": "geo_point"}}}
}
RESTFul风格给索引my_badu_map添加数据;
PUT /my_badu_map/_doc/1
{"name":"天安门","location":{"lon":116.403981,"lat":39.914492}
}PUT /my_badu_map/_doc/2
{"name":"海淀公园","location":{"lon":116.302509,"lat":39.991152}
}PUT /my_badu_map/_doc/3
{"name":"北京动物园","location":{"lon":116.343184,"lat":39.947468}
}
RESTFul风格预览数据如下;
POST /my_badu_map/_search#数据结果如下
{"took" : 815,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 3,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "my_badu_map","_type" : "_doc","_id" : "3","_score" : 1.0,"_source" : {"name" : "北京动物园","location" : {"lon" : 116.343184,"lat" : 39.947468}}},{"_index" : "my_badu_map","_type" : "_doc","_id" : "2","_score" : 1.0,"_source" : {"name" : "海淀公园","location" : {"lon" : 116.302509,"lat" : 39.991152}}},{"_index" : "my_badu_map","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"name" : "天安门","location" : {"lon" : 116.403981,"lat" : 39.914492}}}]}
}
ES的地图检索方式
ES支持的地图检索方式有以下几种;
geo_distance
:直线距离检索,如给定点A,要求返回地图上距离点A三千米的商家(点外卖场景),如图1;
图1 geo_distance场景
geo_bounding_box
:以两个点确定一个矩形,获取在矩形内的全部数据,如图2;
图2 geo_bounding_box场景
geo_polygon
:以多个点,确定多边形,获取多边形内的全部数据,如图3;
图3 geo_polygon场景
基于RESTFul风格实现地图检索
geo_distance
geo_distance
涉及的参数如下
location
:确定一个点;
distance
:确定一个半径,单位米
distance_type
:确定一个图形的类型,一般是圆形,arc
实现要求,查找索引内距离北京站(116.433733,39.908404)3000米内的点;
RESTFUL代码如下;
POST /my_badu_map/_search
{"query": {"geo_distance":{"location":{"lon":116.433733,"lat":39.908404},"distance":3000,"distance_type":"arc"}}
}
RESTFUL代码效果如下,在3千米内,是包含了北京天安门的;
{"took" : 3,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "my_badu_map","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"name" : "天安门","location" : {"lon" : 116.403981,"lat" : 39.914492}}}]}
}
geo_bounding_box
geo_bounding_box
涉及的参数如下
top_left
:左上角的矩形起始点经纬度;
bottom_right
右下角的矩形结束点经纬度
实现要求,查找索引内位于中央民族大学(116.326943,39.95499)以及京站(116.433733,39.908404)矩形的点;
RESTFUL代码如下;
POST /my_badu_map/_search
{"query": {"geo_bounding_box":{"location":{"top_left":{"lon":116.326943,"lat":39.95499},"bottom_right":{"lon":116.433446,"lat":39.908737}}}}
}
RESTFUL代码效果如下,北京动物园和天安门在中央民族大学(116.326943,39.95499)以及京站(116.433733,39.908404)矩形内;
{"took" : 37,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 2,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "my_badu_map","_type" : "_doc","_id" : "3","_score" : 1.0,"_source" : {"name" : "北京动物园","location" : {"lon" : 116.343184,"lat" : 39.947468}}},{"_index" : "my_badu_map","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"name" : "天安门","location" : {"lon" : 116.403981,"lat" : 39.914492}}}]}
}
geo_polygon
geo_polygon
涉及的参数如下
points
:是个数组,存储多变形定点的经纬度,每个点用大括号包起来
实现要求,查找索引内位于西苑桥(116.300209,40.003423),巴沟山水园(116.29561,39.976004)以及北京科技大学(116.364528,39.996348)三角形内的点;
RESTFUL代码如下;
POST /my_badu_map/_search
{"query": {"geo_polygon":{"location":{"points":[{"lon":116.29561,"lat":39.976004},{"lon":116.364528,"lat":39.996348},{"lon":116.300209,"lat":40.003423}]}}}
}
RESTFUL代码效果如下,海淀公园位于西苑桥(116.300209,40.003423),巴沟山水园(116.29561,39.976004)以及北京科技大学(116.364528,39.996348)三角形内;
{"took" : 204,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "my_badu_map","_type" : "_doc","_id" : "2","_score" : 1.0,"_source" : {"name" : "海淀公园","location" : {"lon" : 116.302509,"lat" : 39.991152}}}]}
}
基于Java代码实现地图检索
geo_distance
geo_distance
涉及的参数如下
location
:确定一个点;
distance
:确定一个半径,单位米
distance_type
:确定一个图形的类型,一般是圆形,arc
实现要求,查找索引内距离北京站(116.433733,39.908404)3000米内的点;
Java代码如下;
static RestHighLevelClient myClient= EsClient.getClient(); //获取操作ES的String index="sms-logs-index";String index2="my_badu_map";@Testpublic void geoDistance() throws IOException {//1.SearchRequestSearchRequest request=new SearchRequest(index2);//2.指定检索方式SearchSourceBuilder builder=new SearchSourceBuilder(); builder.query(QueryBuilders.geoDistanceQuery("location").distance("3000").point(39.908404,116.433733));request.source(builder);//3.执行查询SearchResponse resp = myClient.search(request, RequestOptions.DEFAULT);//4.返回结果for (SearchHit hit : resp.getHits().getHits()) {System.out.println(hit.getSourceAsMap());}}
Java代码实现geo_distance如下图4;
图4 Java实现geo_polygon的效果
geo_bounding_box
geo_bounding_box
涉及的参数如下
top_left
:左上角的矩形起始点经纬度;
bottom_right
右下角的矩形结束点经纬度
实现要求,查找索引内位于中央民族大学(116.326943,39.95499)以及京站(116.433733,39.908404)矩形的点;
Java代码如下;
static RestHighLevelClient myClient= EsClient.getClient(); //获取操作ES的String index="sms-logs-index";String index2="my_badu_map";@Testpublic void geoBoundingBox() throws IOException {//1.SearchRequestSearchRequest request=new SearchRequest(index2);//2.指定检索方式SearchSourceBuilder builder=new SearchSourceBuilder();builder.query(QueryBuilders.geoBoundingBoxQuery("location").setCorners(39.95499,116.326943,39.908737,116.433446));request.source(builder);//3.执行查询SearchResponse resp = myClient.search(request, RequestOptions.DEFAULT);//4.返回结果for (SearchHit hit : resp.getHits().getHits()) {System.out.println(hit.getSourceAsMap());}}
Java实现geo_bounding_box的效果如图5;
图5 Java实现geo_bounding_box的效果
geo_polygon
geo_polygon
涉及的参数如下
points
:是个数组,存储多变形定点的经纬度,每个点用大括号包起来
实现要求,查找索引内位于西苑桥(116.300209,40.003423),巴沟山水园(116.29561,39.976004)以及北京科技大学(116.364528,39.996348)三角形内的点;
Java实现代码代码如下;
static RestHighLevelClient myClient= EsClient.getClient(); //获取操作ES的String index="sms-logs-index";String index2="my_badu_map";@Testpublic void geoPolygon() throws IOException {//1.SearchRequestSearchRequest request=new SearchRequest(index2);//2.指定检索方式SearchSourceBuilder builder=new SearchSourceBuilder();List<GeoPoint> points=new ArrayList<>();//注意java里面是纬经度的顺序,不要搞反了points.add(new GeoPoint(39.976004,116.29561));points.add(new GeoPoint(39.996348,116.364528));points.add(new GeoPoint(40.003423,116.300209));builder.query(QueryBuilders.geoPolygonQuery("location",points));request.source(builder);//3.执行查询SearchResponse resp = myClient.search(request, RequestOptions.DEFAULT);//4.返回结果for (SearchHit hit : resp.getHits().getHits()) {System.out.println(hit.getSourceAsMap());}}
Java实现geo_polygon的效果如图6;
图6 Java实现geo_polygon的效果
更多的geo地图检索,可以参考官网geo-queries;
ElasticSearch查询学习笔记章节5——geo_distance,geo_bounding_box,geo_polygon地图检索geo查询相关推荐
- 【ElasticSearch】学习笔记(三)es的高级操作
[ElasticSearch]学习笔记(三)es的高级操作 文章目录 [ElasticSearch]学习笔记(三)es的高级操作 1. 数据聚合 1.1 聚合总类 1.2 DSL实现聚合 1.2.1 ...
- 三、MySQL子查询学习笔记(标量子查询、列子查询、行子查询、表子查询 详解)
三.MySQL子查询学习笔记 7:子查询 含义: 一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询:在外面的查询语句,称为主查询或外查询 分类: 一 ...
- Dom4j 解析Xml文档及 XPath查询 学习笔记
2019独角兽企业重金招聘Python工程师标准>>> 本文查阅方法: 1.查阅目录 -- 查阅本文目录,确定想要查阅的目录标题 2.快捷"查找" ...
- 《B站-ElasticSearch》学习笔记
目录 环境安装 安装ElasticSearch 安装ElasticSearch Hand可视化工具 安装Kibana ES核心概念 物理设计 逻辑设计 文档 类型 索引 倒排索引 IK分词器插件 什么 ...
- 数据库-Elasticsearch进阶学习笔记(分片、映射、分词器、即时搜索、全文搜索等)
目录 基础概念 定义 特点 索引(Index) 分片(Shards) 副本(Replicas) 分配(Allocation) 映射(Mapping) 动态映射 显式映射 常见数据类型 文档(docum ...
- 数据库-Elasticsearch进阶学习笔记(集群、故障、扩容、简繁体、拼音等)
目录 集群 集群配置 单节点集群 分布式集群 故障转移 水平扩容 路由计算&分片控制 数据CRUD流程 写流程 读流程 更新流程 删除流程 分词器 IK分词器 Pinyin分词器 简繁体转换器 ...
- ElasticSearch基础学习笔记
在学习ElasticSearch之前,先简单了解一下Lucene: Doug Cutting开发 是apache软件基金会4 jakarta项目组的一个子项目 是一个开放源代码的全文检索引擎工具包 不 ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)...
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- java分布式免费开源搜索引擎 Elasticsearch 详细学习笔记
网页右边,向下滑有目录索引,可以根据标题跳转到你想看的内容 如果右边没有就找找左边 此文是学习尚硅谷Elasticsearch课程的笔记 Elasticsearch 全文检索引擎 Lucene 是 A ...
最新文章
- 遇到bug心寒了?用Enter键即可解决!
- 从 jQuery 到 VUE 技术栈
- 转载:CSS hack技巧大全
- mybatis configuration的内容必须匹配问题
- Vue实现仿音乐播放器5-实现今日推荐访问百度音乐API获取数据
- 偶然的一次渗透从弱口令->docker逃逸
- sql字符串拼接_Mybatis的SqlSession执行sql过程
- codeforces 59A-C语言解题报告
- c语言贪吃蛇_C语言贪吃蛇完整代码
- 左右xcode的重构选项的一些理解
- Java实现MD5编码32位
- CentOS6.5升级内核到3.10.28
- InnoDB的RR隔离级别能否防止“幻读”
- linux测试wifi信噪比,无线网络中信噪比(SNR)计算
- border-shadow
- Unity-动画系统-Animat
- w7计算机文件夹打开怎么设置密码,w7文件夹怎么设密码_w7文件夹设置密码操作方法...
- QT 科学计算器与谷歌拼音输入法实现
- ketchup 消息队列rabbitmq使用
- 基于C#实现的小型动物识别推理系统
热门文章
- azurecdn搭建https_Azure CDN配置SSL
- 通过flask实现web页面简单的增删改查
- 基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南题八——MiniGUI 和其他嵌入式 Linux 上的图形及图形用户界面系统
- 10001.基于Linux和MiniGUI的嵌入式系统软件开发指南(转载)
- python赋值运算符
- IDEA注册码及快捷键一览
- FPGA基础设计之数码管显示
- C语言程序设计(第4版)苏小红 课后程序参考4.4
- 解决Unity 2017.3.f1 在win10上无法启动的问题, 0xc000007b错误
- python学习基础语法_Python学习笔记之基本语法