将具有特定结构的一个Scala案例类映射到具有不同结构的另一个

时间:2017-08-21 16:03:45

标签: scala elasticsearch elastic4s

我正在构建一个使用Elastic4s Elasticsearch 对话的Scala API。

我从Elastic4s收到的一个回复属于SearchHit类型,其结构如下:

SearchHit(id: String,
          index: String,
          `type`: String,
          score: Float,
          private val _source: Map(name: String,
                                   code: String,
                                   location: Map(lat: Double, lon:Double)
                                  )
          )

我需要将此对象映射到结构的另一个对象:

case class Location(id: Option[String] = None, location: GeoLocation, code: String, name: String)

其中GeoLocation是:

case class GeoLocation(lat: Double, lon: Double)

如您所见,我需要映射到Location的大多数字段都位于_source地图内,但我还需要映射id

1 个答案:

答案 0 :(得分:0)

Elastic4s提供了一个有用的类型类。它被称为HitReader(虽然它可能会更改版本6中的名称 - 即将发布),如果您为类型Location实现此名称,那么您可以在.to[T]上调用object LocationHitReader extends HitReader { def read(hit: Hit): Either[Throwable, T] = ... } 搜索结果。

elastic4s-jackson

手动实现这一点并不能让你比目前所处的更进一步,但弹性4s然后使用常见的json后端提供实现--Jackson,Json4s,Circe,Spray-Json,所以你不会这样做。我必须做任何事情。

例如,如果您使用 Jackson ,则将import ElasticJackson.Implicits._添加到类路径中,然后在搜索结果上方添加以下导入。

.to[Location]

然后,在搜索结果中,您可以致电Seq[Location]以获取.safeTo[Location]Seq[Either[T, Location]以获得HitReader

为了获取id,你可以创建一个自定义{{1}},它委托创建一个的库,添加id。