依据索引文档的地理坐标来进行搜索。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. CodeForces - 990G GCD Counting

    Discription You are given a tree consisting of nn vertices. A number is written on each vertex; the ...

  2. 【树状数组】Gym - 101147J - Whistle's New Car

    题意就是对每个点i,统计在其子树内(不含自身),且depj-depi<=xj的点有多少个. 把点分别按照dep-x和dep进行排序,离线处理, 每次把dep-x小于等于当前dep值的点插入树状数 ...

  3. 【kruscal】【最小生成树】【块状树】bzoj3732 Network

    跟去年NOIP某题基本一样. 最小生成树之后,就变成了询问连接两点的路径上的权值最大的边. 倍增LCA.链剖什么的随便搞. 块状树其实也是很简单的,只不过每个点的点权要记录成“连接其与其父节点的边的权 ...

  4. 【kruscal】【最小生成树】【离线】洛谷 P2266 爱的距离

    建图:每个点向它四周的点连边权为两点点权的差的绝对值的边. 由于有多个需要“施法”的点,所以相当于对每个这样的点,询问与它的距离在T以内的最长边的最小值,即多次询问. 最长边最小之类的,肯定是最小生成 ...

  5. 【矩阵乘法+快速乘】BZOJ2875-[NOI2012]随机数生成器

    [题目大意] 已知Xn+1=(aXn+c) mod m,求Xn mod g. [思路] get到了longlong乘法的正确方法,快速乘.什么是快速乘呢? 简单来讲,快速幂就是模拟了二进制的竖式乘法. ...

  6. FireDac Pooling

    1.建立FDManager的ConnectionDef.并设置此Pooling为True. 2.建立Thread类进行多个FDConnection连接DB. 3.本列是oracle远程数据.如下图: ...

  7. React Native之iOS App打包

    iOS打包步骤(一.二.三可不按照顺序) 步骤一: 选择iOS Device(以下两者选其中一个即可) 选择 Generic iOS Device (个人建议使用这个) 选择Generic iOS D ...

  8. Github上的iOS资料-个人记录

    动画 awesome-ios-animation收集了iOS平台下比较主流炫酷的几款动画框架 RCTRefreshControlqq的下拉刷新 TBIconTransitionKiticon 的点击动 ...

  9. 继续推荐几款VisualStudio的插件(二)

    今天晚上闲着的时候逛了一下,发现了几款不错的VisualStudio插件,这里推荐一下: Exception Breaker 在调试的时候,为了及时发现错误,我们常常会打开"总是引发所有CL ...

  10. Matlab设置字体大小

    1.  设置坐标轴上下限:axis([xmin,xmax,ymin,ymax]); 2.  设置图片大小:set(gcf,'Position',[x1,y1,dx,dy]); x1和y1是图的左下角坐 ...