はてだBlog(仮称)

私的なブログど真ん中のつもりでしたが、気づけばWebサイト系のアプリケーション開発周りで感じたこと寄りの自分メモなどをつれづれ述べています。2020年6月現在、Elasticsearch、pandas、CMSなどに関する話題が多めです。...ですが、だんだんとより私的なプログラムのスニペット置き場になりつつあります。ブログで述べている内容は所属組織で販売している製品などに関するものではなく、また所属する組織の見解を代表するものではありません。

Elasticsearchの検索クエリのチートシートへのリンク集

はじめに

Elasticsearchの検索クエリのチートシートなど。

サクッとなんとなく掴んだ気になるためのリンク集。

あくまで検索クエリをテーマにしとります。インデックスの更新とかクラスターの管理のクエリは対象外。

(いろいろあって、最後に自分用に雑にまとめたチートシートをつけています。)

リンク

もちろん、本来&最初は公式。 ただし、シンタックスの説明があまりないので、それが良いようで、最初のとっかかりとしては何ができるかわかりにくくもある。

www.elastic.co

www.elastic.co

ということで、

最初に、SQLになぞらえて、俯瞰する。 qiita.com

qiita.com

まとめていただいているのにケチをつけるわけではないが、SQLでできない、やりにくいことでできることも多くあるので、Elasticsearchの世界観からは外れすぎないようにしよう。

いろいろクエリの例をまとめてくれているものを見る。 qiita.com

medium.com

この辺で、クエリの雰囲気にも慣れてきたぞということで、 次のステップとして、検索エンジンらしいユースケースや逆引きでまとめてくれている都合の良いやつがあればと思ったけどぱっと見、見つけられず。 (なら自分でやれよというところですが)

番外として、ただしひょっとすると一番便利かもという方法としては、kibanaのDevTool画面でクエリを試し打ちするのが良いかもしれない。 ある程度補完もしてくれるようだ。

また、Ctrl + Space で何も入力してなくても補完候補が現れるみたい。自分はCtrl + SpaceはIMEの切り替えなので、うまく動かない....

手に馴染むこの類のツールでElasticsearchをサポートしているならそれを活用しながら覚えるのが早そう。 というようなことを日常的にやっている人はとっくにそうしてるか。

最終目的が全文検索寄りのニーズだったとしても、kibanaのDevToolはもちろん、グラフの表示をいろいろ試して見ることで、どんな検索クエリが使えそうか肌感覚をつかんでおくのは、学習コースとしてはありのような気がしてきた。

Elasticsearchの全文検索観点に戻る。

ある程度、全部入りのクエリを見てみる。あるいは海外のチートシートのまとめをみてみる。

elasticsearch-cheatsheet.jolicode.com

調査した時はもう2、3見つけたような気がしているが、最近のGoogleさんは見つけてくれず。 ひとまつこの1つだけ。

さいごに(マイチートシート

結局のところ、冒頭の公式のページを軽く舐めながら自分でまとめることにした。

f:id:azotar:20181113205508p:plain

注意:用語統一はできてません。凡例もありません。矢印などの表記ルールは多少気まぐれです。 微妙に自分のユースケースや経験から重視するポイントを書き出しているので、チートシートというわりに観点に偏りや思い込みがあるかもしれません。 厳密なQueryDSLのJSON構造を規定しているわけではありません。 どこかにスキーマ定義かBNF形式とかのがないのかググって見たが見つけられず。

上記のチートシートのポイントを以下箇条書きメモ

  1. Elasticsearchの検索クエリは、基本はJSON形式のDSL。(多少抜け道がある。)
  2. マッチ方法を、match、termなどで指定する。雑に言うと、matchは言語解析で表記の揺らぎ等を吸収した検索。termはぴったりフィットの検索。
  3. rangeやmatch_phrase、term系(Term Query)にいろいろバリエーションがある。match、term、range、match_phraseあたりを基本にしてしっくりこなければリファレンスを当たって見てよりピンポイントの用途にあうものがあればそれを使うことになるだろう。
  4. 緯度経度での検索が可能。距離やポリゴンでの検索や並び替えなどもできて、ナビ系・地図系のサービスそのものを提供しているところでなければ、標準機能だけで十分な気がする。
  5. そもそもクエリの種類として、「クエリ」と「フィルター」系という考え方があり、後者はスコアの計算には使われない...ぐらいの覚え方で良いと思う。
  6. 複数条件を並べる場合は、Boolクエリを使う。boolというプロパティの下に、must、filter、shouldなどを掘っていく。さらにその下に、matchなどLeaf query clausesをくっつける。
  7. mustはAND、shouldは ORに相当。shouldの面白いのは、マッチしたとみなす検索条件の数をいくつにするか指定できる。これで、SQLのようなかっちり検索するするユースケースに比べると、ORのカッコ地獄にならずに済む。
  8. 検索結果の返し方も指定できる。これらはクエリとやや別の塊で、取得件数、ソート条件、返却フィールドを指定できる。
  9. 説明が前後するが、matchやtermの周辺でスコアリングの調整が可能。boost指定もできる。
  10. Aggregationsは、SQLでのGROUP BYで得られるものに近い仕組み。ここで集約方法や集計方法を指定すると、検索結果と合わせて集計結果などが取得できる。
  11. 検索ユースケースでの最も端的な使い方は、ファセットと言われる、絞り込み条件一覧の表示。
  12. いわゆるサジェスト(もしかして検索、Did you mean?)もいくつか揃っている。ただしオートコンプリートしかり、日本語系はこのままでは使いづらいこともあるので、サジェスト用の別のインデックスを用意して、それに対して検索することで個別対応することも多そう。
  13. スクリプト」は検索結果の返却フィールドを、検索結果を返しながら編集できる。基本は使わず奥の手だとは思うが、時間があるときにひととおり眺めておきたいところ。
  14. スクリプト」はいろいろ編集方法があるが、最近のESでは、Painless scriptというDSLが製品側の推奨ぽい。
  15. 検索の時に使う流れでここではまとめているが、インデックス更新の際などにも同じ文法でpainless scriptが利用できる。使える関数などは、Contextによる。
  16. Function Score Queryという概念も頭に入れておこう。「スクリプト」でスコアの調整ができる。複数項目をまたがるスコアリングはこちらなどで行うのだろう。

Full text queries | Elasticsearch Reference [6.4] | Elastic Query and filter context | Elasticsearch Reference [6.4] | Elastic Term level queries | Elasticsearch Reference [6.4] | Elastic Geo queries | Elasticsearch Reference [6.4] | Elastic

Painless contexts | Painless Scripting Language [6.5] | Elastic Function Score Query | Elasticsearch Reference [6.5] | Elastic