Spring数据弹性搜索GeoPoint与spring mvc

时间:2017-02-08 05:02:31

标签: java spring spring-mvc spring-data-elasticsearch geopoints

我正在使用弹性搜索来存储数据(spring data elasticsearch)而我需要在我的文档中存储地理位置。类结构采用以下格式。

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

    @Id
    private String path;

    private String name;

    @GeoPointField
    private GeoPoint geoPoint;

    // setters and getters

}

由于类GeoPoint没有setter,因此它不能与spring 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

}

另一个字段,用于保存字符串表示形式,并在Setter中也更新GeoPiont

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

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

1 个答案:

答案 0 :(得分:0)

您似乎在geo_point数据类型中使用格式为location:"latVal,lonVal"的Elasticsearch中的数据。 Elasticsearch允许将其作为geo_point的有效格式之一。

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

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

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

如果你确保这一点,你将不再需要多次思考你将要接收的类型以及处理它们时的角落情况,同时避免很多混淆。