ES 地理位置信息操作
前提条件
Elasticsearch支持两种类型的地理数据:
- geo_point字段,支持纬度/经度对
- geo_shape字段,支持点、线、圆、多边形、多多边形等
对地理位置信息进行排序,需要使用地理数据类型的字段来存储经纬度信息。
如何优化地理位置索引
- 使用批量请求来提高索引速度。可以尝试一次索引100个文档,然后200个,然后400个等等,每次增加一倍的文档数量。当索引速度开始平稳时,就能知道数据的最佳批量请求大小。
- 使用合适的地理查询类型。Elasticsearch提供了几种不同的地理查询类型,如geo_bounding_box、geo_distance、geo_shape等。根据需求选择最合适的查询类型。
- 使用合适的地理数据类型。Elasticsearch支持两种地理数据类型:geo_point和geo_shape。如果只需要存储纬度/经度对,那么使用geo_point会更简单和高效。如果您需要存储更复杂的地理形状,那么使用geo_shape会更灵活和精确。
geo_bounding_box
vs geo_distance
vs geo_shape
- geo_bounding_box查询:找到与指定的矩形框相交的地理形状或地理点。
- geo_distance查询:找到与指定位置在一定距离范围内的地理点。
- geo_shape查询:找到与指定的地理形状有某种空间关系(如相交、包含)的地理形状或地理点。
示例
- 按照距离某个城市中心的远近来排序:http
GET /_search { "sort" : [ { "_geo_distance" : { "pin.location" : { // pin.location是一个geo_point类型的字段 "lat" : 40.715, "lon" : -73.998 }, "order" : "asc", "unit" : "km" } } ] }
- 使用两个点的geo_bounding_box查询的例子:http
{ "query": { "bool": { "must": { "match_all": {} }, "filter": { "geo_bounding_box": { "location": { "top_left": { "lat": 40.73, "lon": -74.1 }, "bottom_right": { "lat": 40.01, "lon": -71.12 } } } } } } }