1、最近点查询
POST /index/_search
{
"sort": [
{
"_geo_distance": {
"location": {
"lat": 33,
"lon": 111
},
"order": "asc",
"unit": "km",
"distance_type": "plane"
}
}
]
}
java代码
import io.searchbox.client.JestClient;
import io.searchbox.core.Search;
import io.searchbox.core.SearchResult;
import org.elasticsearch.common.unit.DistanceUnit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.GeoDistanceSortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
GeoDistanceSortBuilder sortBuilder = SortBuilders.geoDistanceSort("location", "")
.point(33, 111)
.unit(DistanceUnit.METERS)
.order(SortOrder.ASC);
searchSourceBuilder.sort(sortBuilder);
searchSourceBuilder.from(0);
searchSourceBuilder.size(1);
String query = searchSourceBuilder.toString();
Search search = new Search.Builder(query).addIndex(LccWgsModel.ESINDEX).build();
SearchResult result = jestClient.execute(search);
List<LccWgsModel> dataList = result.getSourceAsObjectList(LccWgsModel.class, true);
System.out.println(dataList.size());
System.out.println(new Gson().toJson(dataList));
报错的话直接query字符串查询
String query = "{\"from\":0,\"size\":1,\n" +
" \"sort\": [\n" +
" {\n" +
" \"_geo_distance\": {\n" +
" \"location\": [\n" +
" {\n" +
" \"lat\": 33,\n" +
" \"lon\": 111\n" +
" }\n" +
" ],\n" +
" \"unit\": \"km\",\n" +
" \"distance_type\": \"plane\",\n" +
" \"order\": \"asc\",\n" +
" \"validation_method\": \"STRICT\"\n" +
" }\n" +
" }\n" +
" ]\n" +
"}";
2、圆形和圆环查询
GET /attractions/restaurant/_search
{
"query": {
"geo_distance": {
"distance": 10000,
"location": {
"lat": 24.46,
"lon": 118.1
}
}
}
}
匹配那些距离中心点大于等于 1km 而小于 2km 的位置
GET /attractions/restaurant/_search
{
"query": {
"filtered": {
"filter": {
"geo_distance_range": {
"gte": "1km",
"lt": "2km",
"location": {
"lat": 40.715,
"lon": -73.988
}
}
}
}
}
}