根据索引文档的地理坐标来进行搜索,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是不是很炫?革命尚未成功,同志仍需努力!坚持你才能看到最美的风景,即便一路上会有荆棘。接下来看看,空间搜索对应的高亮和聚合。待续……

[ElasticSearch] 空间搜索 (一)相关推荐

  1. ElasticSearch分布式搜索框架

    目录 一. ElasticSearch背景 1.1 Elasticsearch介绍 1.2 Elasticsearch现状 1.3 Es最佳实践 二. 环境配置安装 2.1 Elasticsearch ...

  2. elasticsearch分布式搜索配置文件详解

    2019独角兽企业重金招聘Python工程师标准>>> Elasticsearch是一个开源的分布式实时搜索与分析引擎,支持云服务.它是基于Apache Lucene搜索引擎的类库创 ...

  3. 基于Solr的空间搜索学习笔记

    基于Solr的空间搜索学习笔记 在Solr中基于空间地址查询主要围绕2个概念实现: (1) Cartesian Tiers 笛卡尔层 Cartesian Tiers是通过将一个平面地图的根据设定的层次 ...

  4. 基于Elasticsearch实现搜索推荐

    在基于Elasticsearch实现搜索建议一文中我们曾经介绍过如何基于Elasticsearch来实现搜索建议,而本文是在此基于上进一步优化搜索体验,在当搜索无结果或结果过少时提供推荐搜索词给用户. ...

  5. ElasticSearch学习29_基于Elasticsearch实现搜索推荐

    2019独角兽企业重金招聘Python工程师标准>>> 在基于Elasticsearch实现搜索建议一文中我们曾经介绍过如何基于Elasticsearch来实现搜索建议,而本文是在此 ...

  6. Solr空间搜索原理分析与实践

    前言 在美团CRM系统中,搜索商家的效率与公司的销售额息息相关,为了让BD们更便捷又直观地去搜索商家,美团CRM技术团队基于Solr提供了空间搜索功能,其中移动端周边商家搜索和PC端的地图模式搜索功能 ...

  7. 基于Java、Kafka、ElasticSearch的搜索框架的设计与实现

    Jkes是一个基于Java.Kafka.ElasticSearch的搜索框架.Jkes提供了注解驱动的JPA风格的对象/文档映射,使用rest api用于文档搜索. 项目主页:https://gith ...

  8. 【Elasticsearch】十九种Elasticsearch字符串搜索方式

    1.概述 十九种Elasticsearch字符串搜索方式 刚开始接触Elasticsearch的时候被Elasticsearch的搜索功能搞得晕头转向,每次想在Kibana里面查询某个字段的时候,查出 ...

  9. 【Elasticsearch】十九种Elasticsearch字符串搜索方式终极介绍 各种 查询

    本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载. 可以加我问问题,免费解答,有问题可以先私聊我,本人每天都在线,会帮助需要的人. 但是本博主因为某些原因, ...

最新文章

  1. java陷阱之自动拆箱
  2. python简单装饰器_简单介绍Python装饰器(一)
  3. type python_typepython
  4. vim tab设置为4个空格
  5. jquery 总结
  6. leetcode 64. 最小路径和(递归 / 动态规划解法图解)(Java版)
  7. python之从文件中按行读取数据
  8. python如何使用多态_在python 3中,如何将多态应用于类
  9. html页面如何接受提示参数,html页面如何象asp一样接受参数_javascript教程
  10. 深度学习模型在训练集上很好而在测试集表现得不好而拟合次数并不多_机器学习中的过拟合,欠拟合和偏倚方差折衷...
  11. LeetCode 120. 三角形最小路径和(动态规划)
  12. HDU1572 下沙小面的(2)【全排列】
  13. 数学实验matlab课后习题,数学实验练习题(MATLAB)
  14. shell脚本如何获取当前时间
  15. SQLite:注意查询条件中空格的影响
  16. 读懂了鱼玄机,就读懂了爱情
  17. proteus 的使用
  18. Android3dtouch xposed,你不应错过的 8 款优秀 Xposed 模块 2015 年度盘点
  19. Angular+PrimeNg 分页器给后端传参分页
  20. 操作系统实验八:页面置换模拟程序设计

热门文章

  1. 提取IEMOCAP情感语料库标签
  2. php 蓝奏网盘上传文件,蓝奏云盘客户端v2.6 支持文件夹和大文件上传了
  3. pda输出模式设置,在pda手持设备上,文本框的输入监听焦点受输出模式影响
  4. 苏州实时公交app接口根据站台查询公交状态
  5. 首席新媒体黎想教程:短视频内容运营方法论
  6. ORA-00392: log 15 of thread 1 is being cleared, operation not allowed
  7. 前端uni框架学习day_2
  8. 数字电子技术-组合逻辑电路
  9. 探索性数据分析-如何描述业务量数据
  10. 判断IP的正确与否(C语言)