依据索引文档的地理坐标来进行搜索。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"
}
}]}}}}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

示意图 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分布式搜索和数据分析引擎-ElasticStack(上)v7.14.0

    Elasticsearch概述 **本人博客网站 **IT小神 www.itxiaoshen.com Elasticsearch官网地址 https://www.elastic.co/cn/elast ...

  2. 基于Solr的空间搜索

    如果需要对带经纬度的数据进行检索,比如查找当前所在位置附近1000米的酒店,一种简单的方法就是:获取数据库中的所有酒店数据,按经纬度计算距离,返回距离小于1000米的数据. 这种方式在数据量小的时候比 ...

  3. R-tree 一种空间搜索的动态索引结构

    译林:R-tree 一种空间搜索的动态索引结构Antonm Guttman 摘要为了有效地处理空间数据,正如在计算机辅助设计和地理数据应用中所要求的那样,数据库需要一种索引机制能根据它们的空间位置快速 ...

  4. solr特点八:Spatial(空间搜索)

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

  5. ElasticSearch位置搜索

    ElasticSearch位置搜索 学习了:https://blog.csdn.net/bingduanlbd/article/details/52253542 学习了:https://blog.cs ...

  6. Solr 空间搜索配置、按经纬度计算距离排序

    Solr 空间搜索配置 1. 在solr目录下的找到conf文件夹下的schema.xml. <fields> <!-- 在fields元素中添加如下代码 --> <fi ...

  7. ElasticSearch入门-搜索(java api)

    ElasticSearch入门-搜索(java api) package com.qlyd.searchhelper; import java.util.Map; import net.sf.json ...

  8. PHP使用ElasticSearch做搜索

    PHP 使用 ElasticSearch 做搜索 https://blog.csdn.net/zhanghao143lina/article/details/80280321 https://www. ...

  9. 十九种Elasticsearch字符串搜索方式终极介绍

    前言 刚开始接触Elasticsearch的时候被Elasticsearch的搜索功能搞得晕头转向,每次想在Kibana里面查询某个字段的时候,查出来的结果经常不是自己想要的,然而又不知道问题出在了哪 ...

随机推荐

  1. python requests的安装与简单运用(转)

    http://www.cnblogs.com/fightformylife/p/4134986.html http://cn.python-requests.org/zh_CN/latest/ htt ...

  2. CentOS 7.1 中文正式版下载 - 最流行的免费开源企业级 Linux 服务器操作系统

    如果说 Ubuntu 是现今最受桌面用户欢迎的 Linux 操作系统,那么 CentOS 就是最受公司.企业.IDC 喜爱的 Linux 发行版了.得益于极为出色的稳定性,全球范围内无数著名网站均选用 ...

  3. 【二维单调队列】BZOJ1047-[HAOI2007]理想的正方形

    [题目大意] 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. [思路] 裸的二维单调队列.二维单调队列的思路其实很简单: (1)对于每 ...

  4. Spark1.4安装问题

    1)按照<大数据Spark企业级实战>第2章中的方法构建Spark集群,最后发现master可以正常启动,但是worker却都没有启动,原因是不能直接使用在slave模版文件 slaves ...

  5. fidder模拟post提交到PHP遇到的问题

    http头必须带上Content-type: application/x-www-form-urlencoded  之后 ,php 才能接收到post数据 1. 用php://input可以很便捷的取 ...

  6. perspective 的笔记

    以前看到别人做的banner图,3d变化,很羡慕啊,一直不知道怎么做,直到看到了这个样式perspective,然后就知道怎么实现了 一个简单的例子,扫起 demo下在地址    http://fil ...

  7. SQL Server 基础 之 CASE 子句

    SELECT TOP 10 SalesOrderID, SalesOrderID % 10 AS 'Last Digit',-- 求最后一位的值 Position = CASE SalesOrderI ...

  8. 想使用gevent、mysql、sqlalchemy实现python项目协程异步达到并发的效果

    如题,但是查看了很多资料,都说python这边的mysql不支持异步并发,只能阻塞进行,心塞30秒,暂时放弃这方面的研究 如果不操作数据库的化,比如请求url.操作文件,还是可以用gevent来异步实 ...

  9. PHP文件包含漏洞总结

    0x00 前言 PHP文件包含漏洞的产生原因是在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入. 最常见的就属于本 ...

  10. ubuntu中apt使用以及centos中yum的使用

    centos和ubuntu是两大linux主流阵营 在centos中下载安装软件的方式 rpm rpm命令是RPM软件包的管理工具.rpm原本是Red Hat Linux发行版专门用来管理Linux各 ...