2016-11-09 8 views
0

Я использую библиотеку elastic4s для запроса elasticsearch (ES). Версия самого упругого и самого ES 2.4.0.elastic4s: deserializing результаты поиска

Предположим, что у меня есть составной объект, который я ставлю 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. Тогда ваш пример будет выглядеть следующим образом.

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 ремеслам его.