2017-08-21 5 views
0

Elasticsearchを使用しているScala APIを構築しています。Elastic4sを使用しています。私はElastic4sから受信ある構造を持つスカラケースクラスを異なる構造の別のスカラケースクラスにマップする

1つの応答タイプSearchHitであり、以下の構造を有する:Iは、構造の別のオブジェクトにこのオブジェクトをマップする必要

SearchHit(id: String, 
      index: String, 
      `type`: String, 
      score: Float, 
      private val _source: Map(name: String, 
            code: String, 
            location: Map(lat: Double, lon:Double) 
           ) 
     ) 

GeoLocation
case class Location(id: Option[String] = None, location: GeoLocation, code: String, name: String) 

case class GeoLocation(lat: Double, lon: Double) 

あなたは、FIEのほとんどを見ることができるように私はLocationにマップされる必要があります_sourceの地図の中にありますが、私はまたidがマップされる必要があります。

+1

'Map(lat:Double、lon:Double)とは何ですか?経度の値を調べるには、緯度をキーとして使用しますか?それは正しいとは言えません。 – jwvh

+0

https://github.com/scalalandio/chimneyを試してみてください – mfirry

+0

@jwvh 'location'は' Map [String、Double] 'ですが、私は応答で' Map(lat →43.65、lon→79.39)。私はそれをシンプルさのために書きました。混乱させて申し訳ありません! – Tanvir

答えて

0

Elastic4sは、便利なtypeclassを提供します。 HitReaderと呼ばれています(バージョン6では名前が変更される可能性がありますが、リリースされる可能性があります)。タイプLocationにこれを実装すると、検索結果に.to[T]を呼び出すことができます。

object LocationHitReader extends HitReader { 
    def read(hit: Hit): Either[Throwable, T] = ... 
} 

手でこれを実装すると、更に多くのあなたは、現時点ではどこよりもあなたを得るが、elastic4sは、共通のJSONのバックエンドを使用して実装を提供しない - ジャクソン、Json4s、キルケ、スプレーJSONあなたはドンので」何かをしなければならない。

たとえば、の場合は、クラスパスにelastic4s-jacksonを追加し、次のインポートを検索結果の上に追加します。

import ElasticJackson.Implicits._

すると、検索結果に、あなたはどの委任するカスタムHitReaderを作成することができ、同様にIDを取得するにはSeq[Either[T, Location]

を取得するためにSeq[Location]または.safeTo[Location]を取得するために.to[Location]を呼び出すことができますライブラリを作成し、idを追加します。

+0

私のLocation caseクラスの 'id'パラメータを' var': 'case class Location(var id:Option [String] = None、location:GeoLocation、code:String、name:String)'に変更しました。次に '.to [Location]'メソッドを使い、そのIDをLocationに追加します。私は可変パラメータを望んでいませんでしたが、今のところうまくいきます。 – Tanvir

+0

それは一つの方法です。もう1つの方法は、あなたのidフィールドを持って、それにidと、elasticsearch idフィールドを入れることです(データにはIDとIDがあります)。余分なフィールドですが、varを避けています。 – monkjack

+0

IDは一意である必要があります。Elasticsearchに、自分のIDを使用すると、同じIDを持つ別のドキュメントを作成できないことを確認する方法がありますか? – Tanvir

関連する問題