【问题标题】:elastic4s: deserializing search resultselastic4s:反序列化搜索结果
【发布时间】:2017-03-03 20:31:34
【问题描述】:

我正在使用 elastic4s 库来查询 elasticsearch (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 的数组。谢谢。

【问题讨论】:

    标签: scala elasticsearch elastic4s


    【解决方案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 比手工制作要容易得多。

    【讨论】:

      猜你喜欢
      • 2017-09-14
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多