2016-08-18 11 views
1

私はこの例を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] 

答えて

0

Optionを使用し、オプションのパラメータを持つcase classを開発:

case class Character(name: String, location: Option[String]) 

Character("Tyrion Lannister", None) 

次に、あなたがしなければならないすべては、それならばNONEオプションを渡すためにあなたのデータ抽出を修正していますデータが見つかりません:

val tyrion = Map("location" -> "King's Landing", "name" -> "Cersei Lannister") 
val cersei = Map("father" -> "Tywin Lannister?", "name" -> "Cersei Lannister") 
val jaime = Map("father" -> "Tywin Lannister", "location" -> "Tower of the Hand") 
val characters = List(tyrion, cersei, jaime) 

case class Character(name: String, location: Option[String]) 

characters.map(x => Character(x.getOrElse("name", "A CHARACTER HAS NO NAME"), x.get("location"))) 

結果characters.map(...)のこのです:あなたはMap速記を使用している、あなたはあなたのを変換することができなければならないことを考えると

def sourceAsMap: Map[String, AnyRef] = if (java.sourceAsMap == null) Map.empty else java.sourceAsMap.asScala.toMap 

res0: List[Character] = List(
     Character(Cersei Lannister,Some(King's Landing)), 
     Character(Cersei Lannister,None), 
     Character(A CHARACTER HAS NO NAME NAME,Some(Tower of the Hand))) 

RichSearchHitのためのソースコードから、sourceAsMapMapオブジェクトを返す必要がありますコードに:

case class Character(name: String, location: Option[String]) 

implicit object CharacterHitAs extends HitAs[Character] { 
    override def as(hit: RichSearchHit): Character = { 
Character(hit.sourceAsMap.getOrElse("name", "A CHARACTER HAS NO NAME"), hit.sourceAsMap.get("location")) }} 
+0

私は完全にOptionクラスに行くことに同意します。私はこの問題をより詳しく調べており、問題は暗黙のオブジェクトのsourceAsMapとtoString部分にあると考えています。 hit.sourceAsMap( "location")。toString sourceAsMap関数の宣言は、Elasticsearchレスポンスの指定されたフィールドからデータを取得します。しかし、結果がMap.emptyの場合、私はtoStringメソッドがエラーであると考えています。 –

+0

更新:toStringを削除し、ケースクラスの参照をAnyRefに変更しました。私はまだキーが見つかりませんエラーを取得します。だから私は答えのために図書館を掘り起こすことに戻る。 –

+0

@JimHendricks 'sourceAsMap()'はScalaの 'Map'オブジェクトを返しませんか?もしそれがあるとすれば、あなたはそれに 'get'を呼び出すことができます。キーがなければ' None'を返します: 'hit.sourceAsMap.get(" location "))' –

関連する問題