2017-02-08 150 views
1

我使用弹性搜索来存储数据(弹簧数据elasticsearch)和我,需要在我的文档中存储地理位置。类结构采用以下格式。弹簧数据弹性搜索GeoPoint与弹簧mvc

@Document(indexName = "outlet") 
public class OutletIndex implements IESMapper { 

    @Id 
    private String path; 

    private String name; 

    @GeoPointField 
    private GeoPoint geoPoint; 

    // setters and getters 

} 

由于是GeoPoint类没有制定者不与春MVC控制器@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 

} 

持有它的字符串表示,并且还更新GeoPiont的二传手内的附加字段。

有没有更好的方法来做到这一点?

编辑:还有一个疑问,有没有什么办法使用字符串作为geopoint(逗号分隔值)?

回答

0

看起来好像你正在使用geo_point数据类型的数据在Elasticsearch中的格式为location:"latVal,lonVal"。 Elasticsearch可以将其作为geo_point的有效格式之一。

Elasticsearch只是提供以您提供的格式存储的数据。对于ES模式中相同的geo_point类型,您可以将其以多种格式存储在不同的文档中,并且当您尝试获取它们时,ES将仅以您存储的格式返回它们。

这个东西会导致问题,就好像您为同类型的不同格式需要专门处理像Java这样的类型安全语言。你可以做2件事:确保始终一致的类型(索引和检索时),处理应用程序端的每个角落案例。

为了避免这一切,我遵循的一个很好的经验法则是使用与Java客户端提供的格式相同的格式。在这种情况下,我不会使用任何自定义的反序列化和序列化逻辑。相反,最好以location:{"lat": latVal, "lon": lonVal}的格式保存位置。 (GeoPoint类需要一个双纬度和一个双纬度)

如果你确保这一点,你将不再需要多次思考你将要接受的类型和他们的角落案例,同时处理它们,同时避免很多混淆。