目录
概念
geo_point是Elasticsearch中用于存储坐标点的数据格式,每一个坐标点都有经度和维度信息,geo_point格式的字段无法做自动映射,需要指定数据类型:
创建索引mapping
PUT address/_mapping/
{
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
},
"location": {
"type": "geo_point"
}
}
}
添加数据
当我们写入数据的时候有三种方式:对象形式、数组形式、字符串形式,建议大家使用对象形式添加数据。
对象形式
PUT /address/doc/1
{
"name": "北京交通大学",
"location": {
"lat": 39.967157,
"lon": 116.322631
}
}
数组形式
表达式:[lon,lat]
PUT /address/doc/1
{
"name": "北京交通大学",
"location": [116.322631, 39.967157]
}
字符串形式
表达式:lat,lon
PUT /address/doc/1
{
"name": "北京交通大学",
"location": "39.957866,116.349652"
}
注意:使用字符串存储时,顺序是“纬度,经度”,使用数组存储时,顺序是“经度,纬度”。
地理位置查询
geo_point支持geo_bounding_box、geo_distance、geo_distance_range、geo_polygon查询。
geo_bounding_box查询
描述:找出落在指定矩形框中的坐标点,默认使用内存过滤,这样需要一条一条计算,这是一种比较低效的查询方式,我们可以指定使用“indexed”方式,这样能够利用倒排索引实现高效检索,但是必须使用对象方式存储数据,但是,这种方式只有对单值存储有效。
代码示例:
GeoBoundingBoxQueryBuilder boxQueryBuilder = QueryBuilders.geoBoundingBoxQuery("location").setCorners(top, left, bottom, right);
geo_distance查询
描述:找出与指定位置在给定距离内的点,Elasticsearch执行过程,是先使用圆的外切正方形快速筛选出点,在判断正方形内的每个点与圆心的距离,由此可见如果能使用倒排索引的range查询同样可以提高查询效率,所以,在设计索引和数据格式的时候,使用单值、对象方式存储经纬度数据,是比较理想的。
代码示例:
GeoDistanceQueryBuilder strateryQuery = QueryBuilders.geoDistanceQuery("location").point(lat, lon).distance(range, DistanceUnit.KILOMETERS);
geo_distance_range查询
描述:找出与指定点距离在给定最小距离和最大距离之间的点
代码示例:
GeoDistanceQueryBuilder strateryQuery = QueryBuilders.geoDistanceQuery("location").point(lat, lon).distance(range, DistanceUnit.KILOMETERS);
geo_polygon 查询
描述:找出落在多边形中的点,这是一种性能极低检索方式,无法使用倒排索引提高查询性能。
代码示例:
GeoShapeQueryBuilder geoShapeQuery = QueryBuilders.geoPolygonQuery("location", geoPoints);
注:geoPoints为List类型