zoukankan      html  css  js  c++  java
  • Elasticsearch--地理搜索

    地理位置索引

    空间搜索映射定义

    elasticsearch中使用geo_point类型定义地理位置。

    示例

    下面是一些示例数据:

    location字段是geo_point类型的,可以使用字符串,数字或者一个对象来提供经纬度。注意使用字符串和数组来提供经纬度时,经度和纬度参数有不同的顺序。最后一条记录使用地理散列值,详细描述见http://en.wikipedia.org/wiki/Geohash

    使用坐标进行查询的方式有多种

    基于距离的排序

    按照与给定地点的距离进行排序。

    {
        "query":{
            "match_all":{
    
            }
        },
        "sort":[
            {
                "_geo_distance":{
                    "location":"48.1312, 2.356",
                    "unit":"km"
                }
            }
        ]
    }
    

    使用_geo_distance表明按照距离进行排序,unit的值有:km(公里),mi(英里)。

    边界框过滤

    当需要在地图上显示结果,或者允许用户标记地图区域来搜索时,非常有用

    {
        "filter":{
            "geo_bounding_box":{
                "location":{
                    "top_left":"52.346, -1.962",
                    "bottom_right":"48.155, 2.356"
                }
            }
        }
    }
    

    通过提供左上和右下坐标,形成一个矩形区域。Elasticsearch会自动计算出该区域,并返回位于该区域中的点的数据记录。

    距离的限制

    把结果限定为离基准点一个选定的距离之内。

    {
        "filter":{
            "geo_distance":{
                "location":"48.656, 2.355",
                "distance":"500km"
            }
        }
    }
    

    任意地理形状搜索

    Elasticsearch使用geo_shape来定义自定义形状。
    映射如下:

    {
        "poi":{
            "properties":{
                "name":{
                    "type":"string",
                    "index":"not_analyzed"
                },
                "location":{
                    "type":"geo_shape"
                }
            }
        }
    }
    

    上面定义了一个poi索引类型,location字段使用geo_shape类型(不同的es版本写法略有不同)。

    geo_shape类型字段的结构语法被称为GeoJson.它允许我们定义各种地理类型。

    一个点的第一个元素是经度,第二个元素是纬度。

    {
        "location":{
            "type":"point",
            "coordinates":[
                -0.265,
                51.5646
            ]
        }
    }
    

    包络线

    一个包络线(Envelope)通过提供左上和右下两个坐标定义一个框。

    {
    "type":"envelope",
    "coordinates":[[-0.265, 51.5646],[56.166, 4.621]]
    }
    

    多边形

    一个多边形通过一个连接点的列表来创建。数组中的第一个点和最后一个点必须是一样的,保证闭合。

    {
    "type":"polygon",
    "coordinates":[
    	[-0.265, 51.5646],[56.166, 4.621],
    	[6.255, 5.5646],[6.166, 9.621],
    	[3.274, 34.566],[12.386, 6.741],
    	[-0.265, 51.5646],[56.166, 4.621]
    	]
    }
    

    多个多边形



    multipolygon形状包含多个多边形,除了有多个多边形还可以包含多个被排除的形状。

    比如查询某个区域中是否有数据时,可以使用多边形定义这个区域,elasticsearch就能返回该区域内的数据。
    下面是一个查询用法:

    把形状保存到索引中

    形状的定义很复杂,但是形状不会经常改变。在索引中定义形状,并在查询中使用它们。
    映射定义如下:

    索引下面数据:

    查询语句如下:

    {
        "filter":{
            "geo_shape":{
                "location":{
                    "index_shape":{
                        "index":"countries",
                        "type":"country",
                        "path":"area",
                        "id":1
                    }
                }
            }
        }
    }
    

    比较最近这两个查询,shape变成了indexed_shape。需要告诉elasticsearch去哪里找这个形状。

  • 相关阅读:
    关于angular2跳路由防止页面刷新的做法(Angular2路由重载)
    使用JavaScript获取前一周的日期
    关于使用css变量实现主题的切换效果
    关于后端下载后端返回的blob类型文件的下载
    关于前端使用JavaScript无法实现canvas打印问题的解决
    项目管理必备:四款免费但好用的项目管理工具
    高效时间管理的18个黄金法则
    与领导相处,一定要谨记这六句话
    努力工作真能让你进步吗?
    如何在项目管理中建立起良好的团队协作关系
  • 原文地址:https://www.cnblogs.com/51zone/p/9853818.html
Copyright © 2011-2022 走看看