[ElasticSearch] 空间搜索 (一)
来源:互联网 发布:顶尖数据恢复破解版 编辑:程序博客网 时间:2024/06/02 12:18
根据索引文档的地理坐标来进行搜索,Elasticsearch 也能够处理这样的搜索。——空间搜索
一、为空间搜索准备映射
PUT my_space_test{ "mappings": { "poi": { "properties": { "name": { "type": "string" }, "locationpoint": { "type":"geo_point" //任意的地理坐标 }, "locationshape": { "type": "geo_shape" //任意的地理形状 } } } }}
二、批量添加数据
POST my_space_test/poi/_bulk{"index":{"_id":1}}{"name":"New York","locationpoint":"40.664167, -73.938611","locationshape":{"type":"polygon","coordinates":[[[4.8833,52.38617],[4.87463,52.37254],[4.87875,52.36369],[4.8833,52.38617]]]}}{"index":{"_id":2}}{"name":"London","locationpoint":[-0.1275,51.5072222],"locationshape":{"type":"polygon","coordinates":[[[0,0],[4.87463,52.37254],[4.87875,52.36369],[0,0]]]}}{"index":{"_id":3}}{"name":"Moscow","locationpoint":{"lat":55.75,"lon":37.616667},"locationshape":{"type":"polygon","coordinates":[[[22,22],[4.87463,52.37254],[4.87875,52.36369],[22,22]]]}}{"index":{"_id":4}}{"name":"Sydney","locationpoint":"-33.859972, 151.211111","locationshape":{"type":"polygon","coordinates":[[[4.8833,52.38617],[4.87463,52.37254],[4.87875,52.36369],[4.8833,52.38617]]]}}{"index":{"_id":5}}{"name":"Sydney","locationpoint":"eycs0p8ukc7v","locationshape":{"type":"polygon","coordinates":[[[4.8833,52.38617],[4.87463,52.37254],[4.87875,52.36369],[4.8833,52.38617]]]}}仔细观看locationpoint字段可以看到坐标可以使用多种形式来赋值,可以使用字符串、数组(只能包含两个数值)、一个对象、地理散列值等来提供经纬度。具体每种方式可能略有不同,具体使用再查相关资料。
再来看一下,locationshape,其形式就更加多样了,可以是一个点 ,即为一组数值对 [ 经度,维度 ] ,也可以是一个框 [ [左,上], [右,下] ],还可以是多边形,但是必须保证第一个坐标和最后一个坐标是相同的,从而保证是一个闭合的图形。[ [ [1,1],[2,2], [3,4] ,[1,1] ] ] ,可以发现多边形的定义中其可以是多个多边形,是一个可扩展的数组。
三、查询方式
3.1 基于距离排序
GET my_space_test/poi/_search{ "query": { "match_all": {} }, "sort": [ { "_geo_distance": { "locationpoint": { "lat": 48.8567, "lon": 2.3508 }, "unit": "km", "order": "asc" } } ]}GET my_space_test/poi/_search{ "query": { "match_all": {} }, "sort": [ { "_geo_distance":<{ "locationpoint": [ //或者是:"locationpoint":" 48.8567,2.3508" 2.3508, 48.8567 ], "unit": "km", "order": "asc" } } ]}以上查询的结果是一样的(注意数组和字符串坐标的位置顺序是不同的)通过距离坐标点 [ 2.3508,48.8567 ]的大小来对查询文档进行排序。这在实际搜索中非常有用,可以返回临近的一些坐标点。
3.2 边界框过滤(获得包含在指定区域内文档)
"query": { "filtered": { "filter": { "bool": { "should": [ { "geo_bounding_box": { "locationpoint": { "top_left": "52.4796,-1.903", "bottom_right": "48.8567,2.3508" } } }, { "geo_distance":{ "distance": 500, "distance_unit": "km", "locationpoint": "48.8567,2.3508" } }]}}}}
示意图 1
返回的文档就像是包含在矩形和圆形中的蓝色点,红色点用来确定边框,红色线段确定距离范围。在图形之外的点就被过滤掉了。以上都是针对类型为geo_point
下面我们来看一下geo_shape类型是如何使用的?
"query": { "filtered": { "filter": { "bool": { "should": [ { "geo_shape": { "locationshape": { "indexed_shape": { //使用已经索引的形状 "index": "my_space_test", "type": "poi", "id": "4", "path": "locationshape" }, "relation": "within" } } }, { "geo_shape": { "locationshape": { //自定义形状——圆 "shape": { "type": "circle", "radius": "1km", "coordinates": [ -45, 45 ] }, "relation": "within" } } },{ "geo_shape": { "locationshape": { "shape": { "type": "envelope", //自定义的形状包络线,即:box(矩形) "coordinates": [ [ -45, 45 ], [ 45, -45 ] ] }, "relation": "within" } } },{ "geo_shape": { "locationshape": { //自定义的多边形,一定要注意,多边形的定义是包含在一个数组中的,是一个可扩展的数组 "shape": { "type": "polygon", "coordinates": [[[1,1],[2,3],[4,2],[1,1]]] }, "relation": "within" } } } ] } } } }首先来说,过滤查询的字段locationshap 中包含多种形状类型,有点、包络线、多边形、甚至说多个多边形
以上的查询是看那些形状位于所查询的形状之内。
我们再来个示意图吧,这样好理解一些。
示意图2
比如说,我们可以定义一个中国的多边形,然后查找那些城市是位于中国的,这些城市也可以是多边形,当然也可以用一个点来定义,通过这样的过滤方式都能够准确的找到。
怎么样?ES是不是很炫?革命尚未成功,同志仍需努力!坚持你才能看到最美的风景,即便一路上会有荆棘。接下来看看,空间搜索对应的高亮和聚合。待续……
2 0
- [ElasticSearch] 空间搜索 (一)
- [ElasticSearch] 空间搜索 (二)
- Elasticsearch多语言搜索入门(一)
- elasticsearch-java api之搜索(一)
- 分布式搜索Elasticsearch——搜索(一)
- 分布式搜索Elasticsearch——搜索(一)
- [搜索]ElasticSearch Java Api(一)
- 分布式搜索Elasticsearch——创建客户端(一)
- 分布式搜索Elasticsearch——项目过程(一)
- 分布式搜索Elasticsearch——创建客户端(一)
- 分布式搜索Elasticsearch——创建客户端(一)
- 分布式搜索Elasticsearch——项目过程(一)
- Elasticsearch(一)-入门以及简单的搜索语法
- 分布式搜索Elasticsearch——项目过程(一)
- ElasticSearch(五)-搜索
- Elasticsearch(五)elasticsearch高亮搜索
- Linux下Elasticsearch搜索之(一)
- ElasticSearch(五)--搜索Search
- 8行代码教你搞定导航控制器全屏滑动返回效果
- Java基础----面向对象
- UNIX网络编程1 理解同步、阻塞、非阻塞、异步网络I/O
- stl 静态数组初始化vector及pair,vector混合使用
- dos删除文件命令
- [ElasticSearch] 空间搜索 (一)
- 如何:使用 DataAnnotations 特性验证模型数据
- centos端口转发神器:socat安装及使用
- 时间相加
- POJ 1182 食物链(并查集)
- PDA手持终端 C#热键例子代码
- CSUOJ:经营小卖部
- js笔记
- spring-struts-mybatis整合错误集锦