我们可能会遇到根据当前所在的位置,找到自己身边的符合条件的一些商店,酒店之类的。它主要支持两种类型的地理查询:一种是地理点(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关键字其它还是需要了解一下,不必死记,用熟了自然而然就知道了给大家贴一下