[ElasticSearch] 空间搜索 (一)
依据索引文档的地理坐标来进行搜索。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="">
"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 中包括多种形状类型。有点、包络线、多边形、甚至说多个多边形
[ElasticSearch] 空间搜索 (一)的更多相关文章
- Elasticsearch分布式搜索和数据分析引擎-ElasticStack(上)v7.14.0
Elasticsearch概述 **本人博客网站 **IT小神 www.itxiaoshen.com Elasticsearch官网地址 https://www.elastic.co/cn/elast ...
- 基于Solr的空间搜索
如果需要对带经纬度的数据进行检索,比如查找当前所在位置附近1000米的酒店,一种简单的方法就是:获取数据库中的所有酒店数据,按经纬度计算距离,返回距离小于1000米的数据. 这种方式在数据量小的时候比 ...
- R-tree 一种空间搜索的动态索引结构
译林:R-tree 一种空间搜索的动态索引结构Antonm Guttman 摘要为了有效地处理空间数据,正如在计算机辅助设计和地理数据应用中所要求的那样,数据库需要一种索引机制能根据它们的空间位置快速 ...
- solr特点八:Spatial(空间搜索)
前言 在美团CRM系统中,搜索商家的效率与公司的销售额息息相关,为了让BD们更便捷又直观地去搜索商家,美团CRM技术团队基于Solr提供了空间搜索功能,其中移动端周边商家搜索和PC端的地图模式搜索功能 ...
- ElasticSearch位置搜索
ElasticSearch位置搜索 学习了:https://blog.csdn.net/bingduanlbd/article/details/52253542 学习了:https://blog.cs ...
- Solr 空间搜索配置、按经纬度计算距离排序
Solr 空间搜索配置 1. 在solr目录下的找到conf文件夹下的schema.xml. <fields> <!-- 在fields元素中添加如下代码 --> <fi ...
- ElasticSearch入门-搜索(java api)
ElasticSearch入门-搜索(java api) package com.qlyd.searchhelper; import java.util.Map; import net.sf.json ...
- PHP使用ElasticSearch做搜索
PHP 使用 ElasticSearch 做搜索 https://blog.csdn.net/zhanghao143lina/article/details/80280321 https://www. ...
- 十九种Elasticsearch字符串搜索方式终极介绍
前言 刚开始接触Elasticsearch的时候被Elasticsearch的搜索功能搞得晕头转向,每次想在Kibana里面查询某个字段的时候,查出来的结果经常不是自己想要的,然而又不知道问题出在了哪 ...
随机推荐
- Xamarin XAML语言教程构建ControlTemplate控件模板 (二)
Xamarin XAML语言教程构建ControlTemplate控件模板 (二) (2)打开MainPage.xaml文件,编写代码,将构建的控件模板应用于ContentView中.代码如下: &l ...
- intellij idea 为JavaEE项目建立Servlet
建立Servlet的方法 顶部菜单栏 View > Tool Windows > Web. 然后互相web窗口 右键Web>new>Servlet 弹出窗口
- 【AC自动机】【高斯消元】hdu5955 Guessing the Dice Roll
http://blog.csdn.net/viphong/article/details/53098489 我有一点不是很懂,这样算出来转移到AC自动机根节点的概率是一个远大于1的数. 按我的理解,因 ...
- 【动态规划】bzoj1270 [BeijingWc2008]雷涛的小猫
暴力dp是n^2*m的……我们计算每棵树在每层的答案的时候,都需要计算出从那棵树转移过来最优. 但是我们发现,对一棵树而言,从上面转移过来都是一样的,所以我们可以在计算每棵树在每层的答案的时候,先预处 ...
- C++ set自定义排序规则(nyist 8)
C++的容器大多数都是自动排序的,所以你使用这些容器时,你加入的元素类型必须是可以比较大小的,如果不是,则需要自定义排序规则,例如你自定义的结构体: #include <iostream> ...
- glib wpa_supplicant Unix上库编译错误解决与总结
编译Linux下的库是一件痛苦的事情,这里主要阐述glib和wpa_supplicant库的编译,因各自的依赖关系,另外一些库要事先编译.glib依赖libffi和zlib,而wpa_supplica ...
- Android消息机制探索(Handler,Looper,Message,MessageQueue)
概览 Android消息机制是Android操作系统中比较重要的一块.具体使用方法在这里不再阐述,可以参考Android的官方开发文档. 消息机制的主要用途有两方面: 1.线程之间的通信.比如在子线程 ...
- 【java】在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException
场景: 在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException 错误: java.lang ...
- Discuz! 6.x/7.x 版本 前台任意代码执行漏洞
一.漏洞原理: 由于php5.3.x版本里php.ini的设置里request_order默认值为GP,导致Discuz! 6.x/7.x 全局变量防御绕过漏洞. include/global.fun ...
- 鸟哥的linux私房菜服务器架设篇第五章linux常用网络指令
ifconfig主要可以手动启动观察修改网络接口的相关参数 ifdown,ifup用来启动和关闭接口,后面直接接接口名称 两部主机两点沟通:ping 两主机之间各节点分析 traceroute 查看本 ...