Я будую API Scala, з яким розмовляю Еластичний пошук використовуючи Еластичні4.
Я отримав відповідь від 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 для відповіді № 1Elastic4s пропонує клас класів, який допоможе. Це називається HitReader
(хоча це може змінити назву у версії 6 - буде випущено), і якщо ви застосуєте це для свого типу Location
то можна зателефонувати .to[T]
на результати пошуку.
object LocationHitReader extends HitReader {
def read(hit: Hit): Either[Throwable, T] = ...
}
Здійснюючи це вручну, вам не надто багатодалі, ніж ви знаходитесь на даний момент, але elastic4s надає реалізації із використанням загальних бекендів json - Jackson, Json4s, Circe, Spray-Json, так що вам не потрібно нічого робити.
Якщо ви використовуєте Джексон наприклад, тоді ви додаєте elastic4s-jackson
до шляху до вашого класу, а потім додайте наступний імпорт над результатами пошуку.
import ElasticJackson.Implicits._
Потім за результатами пошуку ви можете зателефонувати .to[Location]
щоб отримати Seq[Location]
або .safeTo[Location]
щоб отримати Seq[Either[T, Location]
Щоб також отримати ідентифікатор, ви можете створити власний HitReader
який делегатів у бібліотеці створив, додавши ідентифікатор.