2016-11-09 79 views
0

我正在使用elastic4s庫來查詢elasticsearch(ES)。 elastic4s和ES本身的版本2.4.0。elastic4s:反序列化搜索結果

假設我有,我把到ES樣

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

其中KEYVAL是

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

現在我問ES並得到了我想要deserialiize回MyObject響應複合對象:

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 typeclass。你的例子會看起來像這樣。

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比手工製作容易得多。