ES Java 保持经纬度值
引言
在大数据时代,地理位置信息变得越来越重要。许多应用程序需要处理和存储经纬度值,以便进行地理位置分析、路线规划和位置推荐等功能。Elasticsearch(以下简称ES)是一个功能强大的分布式搜索和分析引擎,它提供了处理地理位置数据的能力。本文将介绍如何使用Java语言在ES中存储和查询经纬度值。
ES中的地理位置数据类型
ES提供了两种主要的地理位置数据类型:geo_point
和geo_shape
。geo_point
用于存储经纬度坐标,而geo_shape
用于存储复杂的地理形状(如多边形)。本文将重点介绍如何使用geo_point
类型来存储经纬度值。
建立索引
在开始之前,我们需要创建一个索引并定义一个geo_point
类型的字段来存储经纬度值。以下是一个示例的ES索引映射定义:
PUT /my_index
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
在上述示例中,我们创建了一个名为my_index
的索引,并在其中定义了一个名为location
的字段,它的类型是geo_point
。
存储经纬度值
在存储经纬度值之前,我们需要使用Java客户端连接到ES集群。以下是一个简单的Java代码示例:
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
public class ElasticsearchClient {
private RestHighLevelClient client;
public ElasticsearchClient() {
client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http")
)
);
}
}
在上述示例中,我们使用RestHighLevelClient类来建立与ES的连接。请确保替换localhost
和9200
为您ES集群的正确主机和端口。
一旦我们建立了与ES集群的连接,我们就可以使用Java客户端将经纬度值存储到ES索引中。以下是一个示例代码:
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.rest.RestStatus;
public class ElasticsearchClient {
// ...
public void indexLocation(String index, String id, double lat, double lon) throws IOException {
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("location", lat + "," + lon);
IndexRequest request = new IndexRequest(index)
.id(id)
.source(jsonMap, XContentType.JSON);
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
if (response.status() == RestStatus.CREATED) {
System.out.println("Location indexed successfully");
} else {
System.out.println("Failed to index location");
}
}
}
在上述示例中,我们创建了一个Map对象jsonMap
,并将经纬度值作为字符串存储在其中。然后,我们使用IndexRequest对象将这个Map对象作为文档的源,并将其存储到指定的索引和文档ID中。
查询经纬度值
一旦我们已经将经纬度值存储到ES索引中,我们可以使用Java客户端查询这些值。以下是一个示例代码:
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.unit.DistanceUnit;
import org.elasticsearch.index.query.GeoDistanceQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
public class ElasticsearchClient {
// ...
public void searchLocations(String index, double lat, double lon, int distance) throws IOException {
GeoDistanceQueryBuilder queryBuilder = QueryBuilders.geoDistanceQuery("location")
.point(lat, lon)
.distance(distance, DistanceUnit.KILOMETERS);
SearchRequest searchRequest = new SearchRequest(index)
.source("{\"query\": {\"geo_distance\": " + queryBuilder.toString() + "}}");
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] hits = searchResponse.getHits().getHits();
for (SearchHit hit : hits) {
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
System.out.println("