有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用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) 个答案

  1. # 1 楼答案

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

    Elasticsearch只提供以您给定的格式存储的数据。对于ES模式中的同一地理点类型,您可以将其以多种格式存储在不同的文档中,当您尝试获取它们时,ES将以您存储的格式返回它们

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

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

    如果您确保了这一点,您将不再需要在处理它们时多次考虑将要接收的类型及其角落案例,同时避免大量混淆