ソフトウェアの話かもしれないはじめにElasticsearchには、Suggestersといういわゆる検索BOXのオートコンプリート等に使える問い合わせのAPIがあるようです。先人が様々なカタチで利用方法やTIPS等をまとめていただいています。Suggerstersに限らないものの、製品がどんどん発展的にバージョンアップしているので、記事の当時と、問い合わせの考え方は変わっていないものの、クエリのシンタックスが変わっているものもいくつかあるように感じました。いや変わっていないのかもしれませんが、公式リファレンス等、シンタックスとしての「suggest」や変数としての「xxx-suggest」など、「suggest」という文字がクエリ内に頻出するので*1、ひとまずコピペで試してみたいという時に個人的に混乱したので、今回、ひとまず現行バージョンのElasticsearchの公式リファレンスを元ネタに、サジェストのクエリや前提となるマッピングの関係を一枚絵にまとめてみることにしました。対象のElasticsearchのバージョンは6.xです。公式リファレンスのページはこちら。*2www.elastic.coElasticsearch6.xのSuggestersのクエリのシンタックス利用できるクエリは4つあります。suggester"という仕組みがあるのですがここでは省略します。ワードの誤記に絞って行う「もしかして」。レーベンシュタイン距離。複数ワードは別々に問い合わせされる。入力された複数ワードをフレーズとみなして(≒並びを意識して)サジェスト。いわゆるオートコンプリート。他のものよりレスポンス重視。同じ検索語でも何を探しているかはコンテキストによるよねということで、あるカテゴリーのコンテキストの場合は、この系列のワードをサジェストする...というのが制御できるサジェスト。私は、1はterm系、2はphrase系、3、4はcompletion系と覚えることにしました。公式リファレンスをまとめたと言いながらやや私の視点での「こんな用途だよね」の言い回しに寄せていますので、(本件に限らずですが)正式なところは公式リファレンスをご参照ください。それぞれ、インデックスへの格納の仕方等にも条件があります。公式リファレンスの並びのように、1つずつ理解しようとすると、私はなかなか覚えられない予感がしたので、4つならべて確認することにしました。いうことでまとめたのが次↓の一枚絵です。【注】クリックして拡大してください公式リファレンスを参考にしたということもありますが、ここではシンタックスを俯瞰することを目的に、上記は英単語の例に絞っています。日本語で同じことをしようとするともう少し工夫が必要なようです。以下、上記の図の補足です。suggesterインデックスされているテキストに対して、数文字のみ誤記の入っている検索語に対するサジェストを取得しました。クエリでは、text、termプロパティを指定します。suggest_mode等のオプションも指定できますが、ここでは省略しています。Suggesterインデックスされているテキストに対して、数文字のみ誤記の入っている&単語の並びはおおよそそのままの検索語に対するサジェストを取得しました。クエリでは、text、phraseを指定します。gram_sizeなどフレーズ検索を考慮した調整パラメータも指定できますね。マッピングでのanalyzerの指定も重要です。Suggester前提として、mappingでcompletionをtype指定するのと、インデックスには「input」というプロパティでサジェスト取得元の単語を格納します。Suggesterであること自体を示すのと対象フィールドを指定して、オートコンプリート用の候補を得ています。Suggesterであること自体を示すのと対象フィールドを指定して、サジェストを取得します。ここで、contextsというプロパティで、(この例では)"place_type"が"cafe"であるような、コンテキストを指定しています。これにより、"cafe"に該当する、"timmy's"が候補として得られているのですが、そもそも、インデックスには、"timmi'sがplace_typeがcafeおよびfoodであること"を「input」と「contexts」というプロパティで設定して格納してありますし、それができるように、mappingでtype:completion、contexts(のnameがplace_typeですよ、typeはcategoryですよ)といったことが規定されていることに注意ください。category以外に、geoというのも指定できます。そもそも上記の図では、サジェストの元ネタが1レコード、1コンテキストしか無いシンプルな例だったのですが、公式リファレンスではもう少し凝った例がありますので、この先は公式リファレンスを参照ください。textシンタックスという意味では、こんな感じ↓で"text"フィールドを指定できます。クエリのテキスト前項の図の元ネタのクエリーのテキストを貼り付けます。(ほぼ図にキャプチャしているとおりですが、kibanaのDevToolsで試し打ちした結果で一部変わっている部分もあります。}}*1:そういえば、エンドポイントが「_suggest」から「_search」に集約される方向なのはありがたいですね。*2:私の記事はふんわりな内容でおおきくバージョンによっては変わらなそうな内容が中心なので、通常currentにリンクするようにしていますが、今回は6.5のものにリンクしました。(1)はてなブログをはじめよう!azotarさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。