Ich habe mit diesem Beispiel aus dem Elastic4s-Handbuch gearbeitet. Es funktioniert einwandfrei, bis es versucht, ein Dokument abzurufen, für das in der Fallklasse kein Feld angegeben ist.Elastic4s Fallklassen-Beispielfehler suchen, wenn Ergebnisdokument ein Feld fehlt
In diesem Beispiel aus dem Handbuch, sagen wir, ein Ergebnis hatte nur name
und fehlte das Feld location
. Es würde diesen Fehler ergeben:
java.util.NoSuchElementException: key not found: location
Ich bin auf der Suche nach einem guten Ansatz, um mit Suchergebnissen umzugehen, die unterschiedliche Felder haben.
Codebeispiel:
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]
Ich stimme völlig zu, die Option-Klasse ist der Weg zu gehen. Ich habe dieses Problem mehr und das Problem untersucht, und ich glaube, dass das Problem in der SourceAsMap und dem toString Teil des impliziten Objekts ist. hit.sourceAsMap ("location"). toString Die Deklaration der sourceAsMap-Funktion ruft die Daten aus dem angegebenen Feld in der Elasticsearch-Antwort ab. Wenn das Ergebnis jedoch Map.empty ist, denke ich, dass die toString-Methode fehlerhaft ist. –
Update: Ich habe den toString entfernt und die Referenzen in der Fall-Klasse zu AnyRef geändert. Ich bekomme immer noch den Schlüssel nicht gefunden Fehler. Also bin ich zurück, um in die Bibliothek nach Antworten zu graben. –
@JimHendricks Sendet 'sourceAsMap()' kein Scala 'Map' Objekt zurück? Wenn es das tut - und ich denke schon - können Sie 'get' darauf aufrufen, was' None' zurückgeben sollte, wenn es keinen Schlüssel gibt: 'hit.sourceAsMap.get (" location "))' –