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))