elastic4s:反序列化搜索结果
elastic4s: deserializing search results
我正在使用 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 数组。谢谢。
在较新的 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 比手工制作要容易得多。
我正在使用 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 数组。谢谢。
在较新的 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 比手工制作要容易得多。