[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里面查询某个字段的时候,查出来的结果经常不是自己想要的,然而又不知道问题出在了哪 ...
随机推荐
- 【带修莫队】bzoj2120 数颜色
块大小为n2/3. 把询问和修改分开. 每次两个询问之间的修改进行暴力转移,如果修改在上一次询问的区间里,就会对当前状态形成影响. 好慢. #include<cstdio> #includ ...
- 8.1(java学习笔记)注解(Annotation)
一.Annotation Annotation不是程序本身,但它可以对程序进行解释,这一点和注释类似. 但最大的不同点在于,注解可以被其他程序读取,然后可以对其进行一些有针对性操作. 这是注解与注释最 ...
- Linux下使用split按行数进行切割
说明:一般来说split按行数切割多数用在日志文件上. 实例: 将一个大文件分成若干个小文件方法: 例如将一个BLM.txt文件分成前缀为BLM_ 的1000个小文件,后缀为系数形式,且后缀为4位数字 ...
- [测试技术分享]easyFuzzer使用案例分享
easyFuzzer使用案例分享 1.简介: easyFuzzer是wooyun的一位白帽子(光刃)提供的一款用于fuzz文件的工具.平时主要是和网络协议安全打交道,和本地软件安全打交道比较少,所以没 ...
- SQL 日期格式化函数
Sql Server 中一个非常强大的日期格式化函数: 获得当前系统时间,GETDATE(): 2008年01月08日 星期二 14:59 Select CONVERT(varchar(100), G ...
- insert语句太长,有StringBuilder优化一下
private void btnSave_Click(object sender, RoutedEventArgs e) { if (IsInsert) { //假设日历控件没有选日期,那帮它赋一个当 ...
- SVG 基础图形
SVG 基础图形 SVG包含了以下的基础图形元素: 矩形(包括可选的圆角),使用<rect>元素创建 圆形,使用<circle>元素创建 椭圆形,使用<ellipse&g ...
- D3.js系列——元素操作和简单画布操作
一.元素操作: 1.选择元素 select 和 selectAll,以及选择集的概念 var p = d3.select("body").select("p") ...
- iOS开发- 自己主动消失的弹出框
- (void)timerFireMethod:(NSTimer*)theTimer//弹出框 { UIAlertView *promptAlert = (UIAlertView*)[theTimer ...
- 手写一个死锁Demo
相互持有对方锁,导致死锁 package jesse.test04; public class DeadLockSample extends Thread{ private String first; ...