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 がすごい
いやーえぐい。ほんとえぐい。というかこれだけの量をよく定義しはりました。
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
で返ってくる結果のキー名とか方とかも決まってるので、これもとれます。
テスト支援のモジュールもある
まだきちんと試せてないですが、テスト用のモジュールもあります。
Docker を起動するタイプとか、組み込みタイプとか。至れり尽くせり。
サンプルもあって試せる
elastic4s/samples at 151fea1fb680bed793bd3c89149b266bcb9c6129 · sksamuel/elastic4s
丁寧なことに Maven やら Sbt のサンプルプロジェクトも用意されてるので、結構手軽にためせます。
ここでクエリを書いて、.show
で文字列にして確認してを繰り返して、理解が深まった感じです。
与太話
ElasticDsl.scala ってファイルを見ながら、確かに技術ドメインであってもドメインであって、表現してくれてる言語があれば理解が深まる、ってことなのかなー、ORM とかもそういう役割あるのかなー、などと思考が飛躍しておりました。
与太話おわり!elastic4s よいすよ!!