しおしお

IntelliJ IDEAのことなんかを書いてます

elastic4sでcase classを使った登録と検索

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