假设现在有一个需求,让你无论身在任何地方,都可以根据当前所在的位置,找到自己身边的符合条件的一些酒店,那么此时就完全可以使用es来实现,非常合适。
比如我现在在上海某个大厦附近,我要搜索到距离我2公里以内的5星级的带游泳池的一个酒店s,用es就完全可以实现类似这样的基于地理位置的搜索引擎。
建立geo_point类型的mapping,地理位置的数据类型,就是geo_point,说白了,就是一个地理位置坐标点,包含了一个经度,一个维度,经纬度,就可以唯一定位一个地球上的坐标。
PUT /my_index { "mappings": { "my_type": { "properties": { "location": { "type": "geo_point" } } } } }
写入geo_point数据
PUT my_index/my_type/1 { "text": "Geo-point as an object", "location": { "lat": 41.12, "lon": -71.34 } }
根据地理位置进行查询,根据地理位置查询一些点,比如说,下面geo_bounding_box查询,查询某个矩形的地理位置范围内的坐标点。
GET /my_index/my_type/_search { "query": { "geo_bounding_box": { "location": { "top_left": { "lat": 42, "lon": -72 }, "bottom_right": { "lat": 40, "lon": -74 } } } } }
返回结果如下:
{ "took": 81, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 1, "max_score": 1, "hits": [ { "_index": "my_index", "_type": "my_type", "_id": "1", "_score": 1, "_source": { "location": { "lat": 41.12, "lon": -71.34 } } } ] } }
比如41.12,-71.34就是一个酒店,然后我们现在搜索的是从42,-72(代表了大厦A)和40,-74(代表了马路B)作为矩形的范围,在这个范围内的酒店,是什么。
基于geo_point数据搜索指定区域内的实体搜索指定区域范围内的酒店,比如说,我们可以在搜索的时候,指定两个地点,就要在东方明珠大厦和上海路组成的矩阵的范围内,搜索我想要的酒店。
#定义索引 PUT /hotel_app { "mappings": { "hotels": { "properties": { "pin": { "properties": { "location": { "type": "geo_point" } } } } } } } #插入数据 PUT /hotel_app/hotels/1 { "name": "喜来登大酒店", "pin" : { "location" : { "lat" : 40.12, "lon" : -71.34 } } } #矩阵的范围内查询数据 GET /hotel_app/hotels/_search { "query": { "bool": { "must": [ { "match_all": {} } ], "filter": { "geo_bounding_box": { "pin.location": { "top_left" : { "lat" : 40.73, "lon" : -74.1 }, "bottom_right" : { "lat" : 40.01, "lon" : -71.12 } } } } } } }
我们还可以指定东方明珠大厦,上海路,上海博物馆,这三个地区组成的多边形的范围内,我要搜索这里面的酒店。
GET /hotel_app/hotels/_search { "query": { "bool": { "must": [ { "match_all": {} } ], "filter": { "geo_polygon": { "pin.location": { "points": [ {"lat" : 40.73, "lon" : -74.1}, {"lat" : 40.01, "lon" : -71.12}, {"lat" : 50.56, "lon" : -90.58} ] } } } } } }
也可以搜索出,距离我200m,或者1公里内的酒店。
GET /hotel_app/hotels/_search { "query": { "bool": { "must": [ { "match_all": {} } ], "filter": { "geo_distance": { "distance": "200km", "pin.location": { "lat": 40, "lon": -70 } } } } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)