2017-02-08 248 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類需要一個雙緯度和一個雙緯度)

如果你確保這一點,你將不再需要多次思考你將要接受的類型和他們的角落案例,同時處理它們,同時避免很多混淆。