1

私はデータを格納するための弾性検索(spring data elasticsearch)を使用しています。私はドキュメントにジオロケーションを格納する必要があります。クラス構造は次の形式です。クラスGeoPointにはセッターがないのでスプリングデータelasticsearchスプリングmvc付きのGeoPoint

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

    @Id 
    private String path; 

    private String name; 

    @GeoPointField 
    private GeoPoint geoPoint; 

    // setters and getters 

} 

それはスプリングMVCコントローラ内@ModelAttributeアノテーションで動作しません。それは文字列表現だともGeoPiont更新セッター内保持

@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 

} 

追加フィールド:私はそれを更新のだので、私は正面からそれを取得する必要があること。

これを実行する方法はありますか?

EDIT:もう1つの疑問は、文字列をジオポイント(コンマ区切り値)として使用する方法はありますか?

答えて

0

geo_pointのデータ型のデータは、のElasticsearchにあります。これは、Elasticsearchでgeo_pointの有効なフォーマットの1つとして認められています。

Elasticsearchは、指定したフォーマットで保存されたデータを提供するだけです。 ESスキーマ内の同じgeo_pointタイプの場合、異なる書式で複数の書式で格納できます。ESを取得しようとすると、格納された書式で返されます。

このようなことは、Javaのような型保証言語に対して特別に扱われる同じ型の異なる書式を持っているかのように、問題を引き起こします。 2つのことを行うことができます。インデックス作成と取得の両方で一貫性のあるタイプを確保し、アプリケーション側で各コーナーケースを処理します。

このような事態を避けるため、Javaクライアントが提供するフォーマットと同じフォーマットを使用することをお勧めします。ここでは、私はカスタムの非直列化と直列化ロジックを使用しません。代わりに、フォーマットをlocation:{"lat": latVal, "lon": lonVal}に保存する方が良いでしょう。 (GeoPointクラスはdouble latとdouble lonを期待しています)

これを確実にすると、受け取るタイプとコーナーケースを扱う際に同時に複数のことを考える必要がなくなります混乱を避ける。

関連する問題