1

我一直在使用 Elastic4s 手册中的这个示例。在尝试检索没有在案例类中指定字段的文档之前,它工作正常。

在手册中的这个示例中,假设一个结果只有name并且缺少该location字段。它会产生这个错误:

java.util.NoSuchElementException:找不到键:位置

我正在寻找一种处理具有不同字段的搜索结果的好方法。

代码示例:

case class Character(name: String, location: String)

implicit object CharacterHitAs extends HitAs[Character] {
  override def as(hit: RichSearchHit): Character = {
Character(hit.sourceAsMap("name").toString, hit.sourceAsMap("location").toString) }}

val resp = client.execute {
search in "gameofthrones" / "characters" query "kings landing"
}.await

val characters :Seq[Character] = resp.as[Character]
4

1 回答 1

0

开发case class带有可选参数的 a 时,请使用Option

case class Character(name: String, location: Option[String])

Character("Tyrion Lannister", None)

然后你所要做的就是修改你的数据提取器,如果它没有找到数据,则传递一个 None 选项:

val tyrion = Map("location" -> "King's Landing", "name" -> "Cersei Lannister")
val cersei = Map("father" -> "Tywin Lannister?", "name" -> "Cersei Lannister")
val jaime = Map("father" -> "Tywin Lannister", "location" -> "Tower of the Hand")
val characters = List(tyrion, cersei, jaime)

case class Character(name: String, location: Option[String])

characters.map(x => Character(x.getOrElse("name", "A CHARACTER HAS NO NAME"), x.get("location")))

结果characters.map(...)是这样的:

res0: List[Character] = List(
        Character(Cersei Lannister,Some(King's Landing)), 
        Character(Cersei Lannister,None), 
        Character(A CHARACTER HAS NO NAME NAME,Some(Tower of the Hand)))

从 的源代码中RichSearchHitsourceAsMap应该返回一个Map对象:

def sourceAsMap: Map[String, AnyRef] = if (java.sourceAsMap == null) Map.empty else java.sourceAsMap.asScala.toMap

鉴于您使用的是Map速记,您应该能够将代码转换为:

case class Character(name: String, location: Option[String])

implicit object CharacterHitAs extends HitAs[Character] {
  override def as(hit: RichSearchHit): Character = {
Character(hit.sourceAsMap.getOrElse("name", "A CHARACTER HAS NO NAME"), hit.sourceAsMap.get("location")) }}
于 2016-08-18T20:22:41.883 回答