ソモサン

私rohkiによる活動や読書の記録をつらつらと書くページです

Elasticsearch のクエリを知るのに elastic4s がよかった

Elasticsearch はややこしい

ややこしいというか難しいというか、面倒くさいというか…
で考えたところ、そも JSON を組み立てるのがそこそこ以上にしんどいんですよね。末尾の , とか。
Kibana も補完はあるのですが、そのあたりが面倒くさくて、なんか学ぶのが億劫になっておりました。
で、表題の話。elastic4s です。

sksamuel/elastic4s: Elasticsearch Scala Client - Non Blocking, Type Safe, HTTP, REST API, TCP

Scala で Elasticsearch を扱うためのライブラリになってます。
かなーり頑張っていて、検索結果を safeTo で変換できたりとか、ややこしい aggs に型の誘導があったりします。
あと 6.0 以上であれば AWS Elasticsearch Service の IAM 認証付きリクエストも行けます。AWS_DEFAULT_REGION環境変数にいれなきゃですが。

Aggregations がすごい

elastic4s/elastic4s-core/src/main/scala/com/sksamuel/elastic4s/searches/aggs at master · sksamuel/elastic4s

いやーえぐい。ほんとえぐい。というかこれだけの量をよく定義しはりました。

    val resp = http.execute {
      search("childrenaggs").matchAllQuery().aggs(
        dateHistogramAgg("agg1", "date").interval(DateHistogramInterval.Month).addSubagg(
          childrenAggregation("agg2", "answer").addSubagg(
            termsAgg("agg3", "text").size(1)
          )
        )
      )
    }.await.result

    val september = resp.aggs.dateHistogram("agg1").buckets.find(_.date == "01/09/2017").get
    val sept_answers = september.children("agg2")
    sept_answers.docCount shouldBe 3
    sept_answers.terms("agg3").buckets.head.key shouldBe "god"

テストコード から抜粋したのが上記です。
入れ子入れ子入れ子、になってるのかな? もはやわからんわけですが、型に沿って書けるのでよかったです。
んで、aggs で返ってくる結果のキー名とか方とかも決まってるので、これもとれます。

テスト支援のモジュールもある

elastic4s/elastic4s-testkit/src/main/scala/com/sksamuel/elastic4s/testkit at master · sksamuel/elastic4s

まだきちんと試せてないですが、テスト用のモジュールもあります。
Docker を起動するタイプとか、組み込みタイプとか。至れり尽くせり。

サンプルもあって試せる

elastic4s/samples at 151fea1fb680bed793bd3c89149b266bcb9c6129 · sksamuel/elastic4s

丁寧なことに Maven やら Sbt のサンプルプロジェクトも用意されてるので、結構手軽にためせます。
ここでクエリを書いて、.show で文字列にして確認してを繰り返して、理解が深まった感じです。

与太話

ElasticDsl.scala ってファイルを見ながら、確かに技術ドメインであってもドメインであって、表現してくれてる言語があれば理解が深まる、ってことなのかなー、ORM とかもそういう役割あるのかなー、などと思考が飛躍しておりました。
与太話おわり!elastic4s よいすよ!!