はてだBlog(仮称)

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

Elasticsearchを検索サイトのアプリ屋視点でザクッとオーバービュー(公式リファレンスの検索関連注目)

はじめに

検索サイトの初学アプリ屋視点でElasticsearchがどんなものかザクッと知りたい・どんな感じのことができそうかという時がありませんか。

自分がググった範囲だと、シャードとかインフラ寄りの話、特定のユースケースに関する(非常に貴重ではあるが、それなりの前提知識やこういう時にこれができればなあという課題観が求められるので)、逆に初心者向けではあるが用語解説に徹しているというものが多いような気がする。

つまるところ、冒頭の用途は、公式(current)のリファレンスを見てください。以上、終わり。なのかもしれないが、私見では公式リファレンスは内容は十分なんだけど、少し違和感を感じるところがある。

Elasticsearchについては、他の検索エンジンや似たようなソフトに比べると十分すぎるドキュメントなのだけど、とにかくJSON形式であることがわかりやすくもあり、特にXMLよりははるかに楽なのだが、一方でそれでもごちゃごちゃしているようにも見えなくないのと、どうしても入出力ともにネストが入り込む類のものなので、

まあ、「検索」の仕様を真面目に説明しようと思うと、例えばこんなユースケースがあるよね〜とツカミはOKとした上で、こんなデータがあって、データ登録時にこんなANALYZEの仕込みをして、それをこういう条件で検索して、結果はこうなります、という5点セットを説明せねばならんし、でもある設定をこれに変えるとこんな当たり方になるよみたいなのも比較で必要なので骨の折れる仕事だと思います。

あと、これは自分だけかもしれないけど、公式のリファレンスは、各ページのレイアウトでインデックスが左ではなく、かつ右下に配置されているのでこれが思いの外使いづらい。

↓これです。コレ。

f:id:azotar:20181123001817p:plain

とまあ、前置きが長くなってしまったのだけど、そんな公式レファレンスを1時間で流し読みして分かった気分になるためには、という自分なりの読み解き方のメモになります。

製品のコンセプトを把握しましょう

www.elastic.co

www.elastic.co

ここは分量もさして多くないので、最初に読んでおきましょう。

検索クエリの実例をザクッとながめてどんなことができるか雰囲気をつかむ

こちら↓ www.elastic.co

今回のお題からは異なり公式ではないものの次のサイトはコンパクトにクエリの例をまとめていただけているのではと思いましたので、クエリの文法が思いつかない時には参考にさせてもらっています。 medium.com

オプションにもどんなものがありそうか次にどんなことができるのか雰囲気を掴んでおく

www.elastic.co

ある種のデータベースなのでCRUDの体系を見てみる

こちら↓で、CRUDの体系を把握して、

www.elastic.co

  • Single document APIs

  • Index API

  • Get API
  • Delete API
  • Update API
  • Multi-document APIs

  • Multi Get API

  • Bulk API
  • Delete By Query API
  • Update By Query API
  • Reindex API

文字面だけ眺めて、まあ普通にCRUDがあるのと、バルクローダー系や「... By Query API」みたいに、一括パッチ的なやつもあるんでしょうねと理解。

じゃあ何がどんな感じで検索できるのか(Get API)

ここで、 R( つまり、検索ですね。)は少し深掘りしよう。キモである、Get API を流し確認。

www.elastic.co

【参考】Exploring Your Data (実データでのサンプル確認)

1時間で流し読みするをテーマにしているので対象外としていますが、すでにElasticsearchがインストールされた環境があるなら、次のリンクの「Loading the Sample Dataset」に従ってサンプルデータを入れていろいろ試すというのもありかと思う。

www.elastic.co

検索の仕方にも様々(Search APIs)

www.elastic.co

続いて、Search APIs で、様々な検索ができることを知る。

↓文字面を眺めて見ましょう。

f:id:azotar:20181123003539p:plain

ふむふむ。

URI SearchとRequest Body Searchがある。 前者がクエリパラメータで完結する検索、後者が検索クエリを表すJSONをリクエストボディで投げて検索する。 Elasticsearchをフル機能使うなら、後者をマスターしましょうという話。

Request Body Search

www.elastic.co

f:id:azotar:20181123003913p:plain

Request Body Searchを開くと、Queryから始まって、From/Size、Sortぐらいはまでは、まあそうかなと想像がつく感じだが、そっからしばらくよくわからない雰囲気が漂っている。

RescoringとかHighlightingとかは、検索の実用的なサービスや製品をかじっていればなんとなく想像つくところもある。 あと、Explainは、アレかなとか。ただ、やはり最初の3つ以外はなんだろうねというのが自分の場合だった。

クエリDSL (Query DSL) : クエリDSLに寄り道

Search APIsの Queryのセクションにもリンクが貼ってあるのだが、実のところ、ここからはクエリDSLの章を確認した方が良い。

クエリDSLの章はこちら。

www.elastic.co

アタマの良い人はこれを見ていくのが良いと思われるが、そうでもなく、また文句を言いがちな自分の場合は、ここで私立Elasticsearch学園1年1学期末試験用のA4持ち込み可の試験用のカンペを作ることにした。

↓の最後のセクション。

itdepends.hateblo.jp

カンペ(再掲) f:id:azotar:20181113205508p:plain

Search APIsに戻る

クエリDSLの章をおおよそ把握して、Search APIsに戻ってくると、少し見通しが良くなるように感じる。

ここでは、Search APIs- Request Body Search の QueryやFrom/Size以外の項目の一言解説を以下にまとめる。

  1. Post filter(post_filterオブジェクト): SQLのgroup by した結果を、having 句で特定の値をもつグループのみの検索結果に絞るのに似ている。
  2. Rescoring(rescoreオブジェクト):一旦検索してベースのスコアリングののち、トップ何件かを選択した中で、rescoreオブジェクトで別のスコアリングロジックを指定し、これに従いソートする。一旦、検索語との関連度で検索しておき、ユーザに表示する段には、広告を優先表示するような例になるだろう。
  3. Scroll(scroll=xxxクエリパラメータ): 検索結果の無限スクロール用に検索結果をキャッシュしておく。スクロール時は、scroll_idで検索結果を取りに行く。
  4. Named Queries:"query"中で "_name"で定義すると、filterオブジェクトで呼び出せる... という雰囲気の例だけ記載してあるが、察しが悪く良くわかっていない。
  5. Inner hits (inner_hitsオブジェクトで指定): Elasticsearchでは、他の検索エンジンにはなかなか見られないJOINができる。ただし、SQLのJOINを使う感覚では使わない方が良い。それはそうと、そのJOIN相当のためにparent-child(mapping での "_parent")というのがあるが、それを理解してからここに戻ってくるのが良かれと思われる。
  6. Field Collapsing("collapse"オブジェクト): 集計しないGROUP BYみたいなもの。検索結果をグループごとに、配列にして返す。 "field"でcollapseするフィールドを指定する。
  7. Search After( "search_after" 配列?): Scrollと似ていてこちらの方が軽量?なのかな。検索結果に次のページネーションにつながるIDのようなものが返るのでそれを使って、"search_after"に指定したクエリを発行すると前の結果の続きが得られる。

上記には含めなかったが、Fields、Doc value Fieldsは、今後、インデックス更新APIの対になるものを確認してからの読み直しでも良さそう。

この他、社内ドキュメント検索などでは便利なHighlighting(highlightオブジェクト)もありますね。 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-highlighting.html

Search APIs- Request Body Search 以外の項目

テンプレート

Search Template Multi Search Template

名前にテンプレートが入っているものがある... というところを頭の片隅に置くのが良い(逆にいうと、今はそこまで深追いしない)。

分析関連のAPIなど

最初の方でそうなのかなと思っていたAPIはやはりそうで、性能チューニングや検索方法の分析関連も入っていて、次のようなもの。

  1. Preference(preferenceクエリパラメータ) API
  2. Explain(explainフィールドをtrueにして検索) API: そう、explainです。
  3. Validate API
  4. Profile API

Suggesters

今時の検索エンジンなので、その類のものもあるよねといことで、 続いて、Suggestersの一覧に、Term suggester、Phrase Suggester、Completion Suggester、Context Suggester という名前だけ眺めておく。日本語環境だと何かとどこまで使えるかはいろいろあるのではないかと想像しながら....

https://www.elastic.co/guide/en/elasticsearch/reference/6.5/search-suggesters.html

ここら辺でお腹いっぱいになるのと、一時間ぐらいになっちゃうと思われるのでおしまい。