Elasticsearch基于地理位置查询 geo_point

我们可能会遇到根据当前所在的位置,找到自己身边的符合条件的一些商店,酒店之类的。它主要支持两种类型的地理查询:一种是地理点(geo_point),即经纬度查询,另一种是地理形状查询(geo_shape),即支持点、线、圈、多边形查询等

距离计算类型

两点间的距离计算,有多种牺牲性能换取精度的算法:

arc

最慢但最精确的是 arc 计算方式,这种方式把世界当作球体来处理。不过这种方式的精度有限,因为这个世界并不是完全的球体。

plane

plane 计算方式把地球当成是平坦的,这种方式快一些但是精度略逊。在赤道附近的位置精度最好,而靠近两极则变差。

sloppy_arc

如此命名,是因为它使用了 Lucene 的 SloppyMath 类。这是一种用精度换取速度的计算方式, 它使用 Haversine formula来计算距离。它比 arc 计算方式快 4 到 5 倍,并且距离精度达 99.9%。这也是默认的计算方式。

 下面是mapping定义的简单格式

PUT myindex
{
  "mappings": {
    "mytype": {    #这里写上类型,ES6.3后都是doc
      "properties": {
        "title": {
          "type": "text",
          "boost": 2
        },
        "content": {
          "type": "text"
        }
      }
    }
  }
}

 

通过地理坐标点过滤

有四种地理坐标点相关的过滤方式可以用来选中或者排除文档:

  • geo_bounding_box:: 
    找出落在指定矩形框中的坐标点
  • geo_distance:: 
    找出与指定位置在给定距离内的点
  • geo_distance_range:: 
    找出与指定点距离在给定最小距离和最大距离之间的点
  • geo_polygon:: 
    找出落在多边形中的点。这个过滤器使用代价很大。当你觉得自己需要使用它,最好先看看 geo-shapes

索引与mapping创建
http://192.168.11.237:9200/attractions/
{
  "mappings": {
    "restaurant": {
      "properties": {
        "name": {
          "type": "text"
        },
        "location": {
          "type": "geo_point"
        }
      }
    }
  }
}

插入的数据格式
http://192.168.11.237:9200/attractions/restaurant/1
{
  "name":     "Chipotle Mexican Grill",
  "location": "40.715, -74.011" 
}
http://192.168.11.237:9200/attractions/restaurant/3
{
  "name":     "Pala Pizza",
  "location": "40.722, -73.989" 
}
http://192.168.11.237:9200/attractions/restaurant/3
{
  "name":     "Mini Munchies Pizza",
  "location": " 40.719,-73.983" 
}
查询
http://192.168.11.237:9200/attractions/restaurant/_search
{
  "query": {
    "filtered": {
      "filter": {
        "geo_distance": {
          "distance": "10km", 
          "location": { 
            "lat":  40.715,
            "lon": -73.988
          }
        }
      }
    }
  }
}

 

ES 改变索引mapping类型,需要 别名加引用

es中想要给一个已经建好映射的索引改变映射结果,即使改变一个字段类型都是不支持的,需要重新建立索引以及映射结构,然后把以前的数据导入到新建的索引结构中去,完成改变映射结构的目的。

   步骤:

1.给已有的索引定一个别名,并指向该别名

2.新建一个新的索引,新的映射结构

3.将别名指向新的索引,取消旧的索引与别名之间的关联

        通过这几部即可达到重新改变映射结构的内容,例如我们想改变library01的映射中price字段的类型由现有的double变为integer类型。

   从上面图中可以看出来price 类型已经是integer类型了,客户端不需要知道变化也不需要停止es服务,在必要的时候可以使用这个方法。

        在映射中会有很多es关键字其它还是需要了解一下,不必死记,用熟了自然而然就知道了给大家贴一下

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值