私はこの例をElastic4sマニュアルから取り組んできました。それは、caseクラスで指定されたフィールドを持たないドキュメントを取得しようとするまで正常に動作しています。結果ドキュメントにフィールドがない場合のElastic4sの検索ケースクラスのサンプルエラー
このマニュアルの例では、結果にはname
しかなく、location
フィールドがありませんでした。このエラーが発生します:
java.util.NoSuchElementException: key not found: location
私はさまざまなフィールドを持つ検索結果を処理するための良いアプローチを探しています。
コードサンプル:
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]
私は完全にOptionクラスに行くことに同意します。私はこの問題をより詳しく調べており、問題は暗黙のオブジェクトのsourceAsMapとtoString部分にあると考えています。 hit.sourceAsMap( "location")。toString sourceAsMap関数の宣言は、Elasticsearchレスポンスの指定されたフィールドからデータを取得します。しかし、結果がMap.emptyの場合、私はtoStringメソッドがエラーであると考えています。 –
更新:toStringを削除し、ケースクラスの参照をAnyRefに変更しました。私はまだキーが見つかりませんエラーを取得します。だから私は答えのために図書館を掘り起こすことに戻る。 –
@JimHendricks 'sourceAsMap()'はScalaの 'Map'オブジェクトを返しませんか?もしそれがあるとすれば、あなたはそれに 'get'を呼び出すことができます。キーがなければ' None'を返します: 'hit.sourceAsMap.get(" location "))' –