2016-11-09 22 views
0

私はelasticses(ES)をクエリするためにelastic4sライブラリを使用しています。 elastic4sとES自体のバージョン2.4.0。elastic4s:検索結果をデシリアライズ

私は私はESを照会し、私は戻ってMyObjectにdeserialiizeするレスポンスを得た

KEYVALが

case class KeyVal(id: Long, name: String) 

ある

case class MyObject(id: Long, vall: KeyVal, vals: Seq[KeyVal]) 

のようなESに置く複合オブジェクトがあるとします。

implicit object MyObjectHitAs extends HitAs[MyObject] { 
    override def as(hit: RichSearchHit): MyObject = { 
    MyObject(
     hit.field("id").getValue[String] 
     KeyVal(hit.field("vall.id").getValue[Long], field("vall.name").getValue[String]), 
     //what should I code here to get the Seq[KeyVal] ??? 
    ) 
    } 
} 

KeyValの配列をどのように逆シリアル化できますかを説明してください。ありがとうございました。

答えて

1

最近のバージョンのelastic4s、つまり5.0以降では、HitReaderの型付きを使用します。あなたの例は、このようになります。

implicit object MyObjectHitAs extends HitReader[MyObject] { 

    override def read(hit: Hit): Either[Throwable, MyObject] = { 
     val obj = MyObject(
     hit.sourceField("id").toString.toLong, 
     KeyVal(hit.sourceField("vall.id").toString.toLong, hit.sourceField("vall.name").toString), 
     hit.sourceField("vals").asInstanceOf[Seq[AnyRef]].map { entry => 
      KeyVal(hit.sourceField("vall.id").toString.toLong, hit.sourceField("vall.name").toString) 
     } 
    ) 
     Right(obj) 
    } 
    } 

それは手工芸品、それよりもbuilt in json mappersを使用して多くの方が簡単ですが。