我正在构建一个使用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
。
答案 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。