使用Spring mvc的java Spring数据弹性搜索地质点
我使用弹性搜索来存储数据(SpringDataElasticSearch),我需要在我的文档中存储地理位置。类结构采用以下格式
@Document(indexName = "outlet")
public class OutletIndex implements IESMapper {
@Id
private String path;
private String name;
@GeoPointField
private GeoPoint geoPoint;
// setters and getters
}
因为类GeoPoint
没有设置器,所以它不能与SpringMVC控制器中的@ModelAttribute
注释一起使用。我需要从前面获取它,因此我将其更新为:
@Document(indexName = "outlet")
public class OutletIndex implements IESMapper {
@Id
private String path;
private String name;
@GeoPointField
private GeoPoint geoPoint;
private String geoLocation;
public void setGeoLocation(String geoLocation) {
this.geoLocation = geoLocation;
if (geoLocation != null && geoLocation.trim() != "") {
String[] loc = geoLocation.split(",");
this.geoPoint = new GeoPoint(Double.parseDouble(loc[0]), Double.parseDouble(loc[1]));
}
}
// setters and getters
}
一个额外的字段,保存它的字符串表示形式,并在Setter中更新GeoPiont
有没有更好的办法
编辑:还有一个疑问,是否有办法将字符串用作地质点(逗号分隔值)
# 1 楼答案
看起来您正在使用
geo_point
数据类型,数据格式为location:"latVal,lonVal"
的Elasticsearch。Elasticsearch允许将其作为geo_point的有效格式之一Elasticsearch只提供以您给定的格式存储的数据。对于ES模式中的同一地理点类型,您可以将其以多种格式存储在不同的文档中,当您尝试获取它们时,ES将以您存储的格式返回它们
这会引起问题,就好像同一类型有不同的格式需要专门为Java这样的类型安全语言处理一样。您可以做两件事:确保始终保持一致的类型(在索引和检索时),在应用程序端处理每个角落的情况
为了避免所有这些混乱,我遵循的一条经验法则是使用与Java客户机提供的格式相同的格式。在本例中,我不会使用任何自定义反序列化和序列化逻辑。相反,最好将位置保存为
location:{"lat": latVal, "lon": lonVal}
格式。(地质点类需要双lat和双lon)如果您确保了这一点,您将不再需要在处理它们时多次考虑将要接收的类型及其角落案例,同时避免大量混淆