elastic4sを使って↓を試してみました。
case class
の内容をElasticsearchに登録する- 検索結果を
case class
にマッピングして取得する
build.sbt
build.sbt
には、elastic4sを追加します。
val elastic4sVersion = "6.5.1" libraryDependencies ++= Seq( "com.sksamuel.elastic4s" %% "elastic4s-core" % elastic4sVersion, "com.sksamuel.elastic4s" %% "elastic4s-http" % elastic4sVersion, )
データの登録
- 登録対象のデータを持つ
case class
を定義します Indexable
を継承してcase class
の内容を登録用のjsonに変換します
この例では、elastic4sで定義されているObject Mapperを使って単純にjsonに変換しています- データの登録では、docに登録対象のデータを持つ
case class
を指定します
case class Data(id: Long, name: String) implicit object SampleIndexable extends Indexable[Data] { override def json(t: Data): String = JacksonSupport.mapper.writeValueAsString(t) } private val client = ElasticClient(ElasticProperties("http://localhost:9200")) client.execute { indexInto("sample" / "_doc").id("1").doc(Data(1, "sample1")) }.await
データの検索
- HitReaderを継承して検索結果の内容を
case class
に変換します - 検索結果は、toをつかて
case class
に変換して受け取ります
implicit object SampleHitReader extends HitReader[Data] { override def read(hit: Hit): Try[Data] = { Try(Data(hit.sourceAsMap("id").toString.toLong, hit.sourceAsMap("name").toString)) } } val result = client.execute { search("sample") termQuery("name", "sample1") }.await.result.to[Data] println(result.headOption)
実行結果
登録したデータが検索できて、Dataクラスにマッピングできてるのが確認できます。
Some(Data(1,sample1))