0

我正在使用 elastic4s 库来查询弹性搜索(ES)。elastic4s版本和ES本身2.4.0。

假设我有一个像 ES 这样的复合对象

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

其中 KeyVal 是

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

现在我查询了 ES 并得到了我想反序列化回的响应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 的数组。谢谢你。

4

1 回答 1

1

在较新的elastic4s 版本中,即5.0 以后,您将使用typeclass 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)
    }
  }

虽然使用内置的 json 映射器比手工制作要容易得多。

于 2017-03-03T12:31:34.290 回答