Elasticsearch シリーズ
内容 リンク Elasticsearch 基本操作 https://blog.yexca.net/archives/226 Elasticsearch 検索操作 https://blog.yexca.net/archives/227 RestClient 基本操作 https://blog.yexca.net/archives/228 RestClient 検索操作 https://blog.yexca.net/archives/229 Elasticsearch データ集計 https://blog.yexca.net/archives/231 Elasticsearch オートコンプリート この記事 Elasticsearch データ同期 https://blog.yexca.net/archives/234 Elasticsearch クラスター https://blog.yexca.net/archives/235
ユーザーが検索ボックスに文字を入力したときに、その文字に関連する検索候補を表示し、入力された文字に基づいて単語を補完する機能、それがオートコンプリートだよ。
ピンイン分かち書き
文字に基づいて補完を実現するには、ドキュメントをピンインで分かち書きする必要があるんだ。
プロジェクトのURL: https://github.com/medcl/elasticsearch-analysis-pinyin
インストール方法はIKアナライザーと同じだよ。以下はオンラインインストール方法で、まずコンテナに入るんだ。
| |
コマンドを実行するよ。
| |
それから終了して再起動するんだ。
| |
テストしてみよう。
| |
カスタムアナライザー
デフォルトのピンインアナライザーだと、各漢字を個別のピンインに分けちゃうんだ。でも、僕らが欲しいのは、各単語がピンインのまとまりになることだから、ピンインアナライザーをカスタマイズして、独自のカスタムアナライザーを作る必要があるね。
Elasticsearchのアナライザーは3つの部分で構成されてるよ。
- character filters:tokenizerの前にテキストを処理する部分。例えば、文字の削除や置換とかね。
- tokenizer:テキストを一定のルールに従って単語(term)に分割する部分。例えばkeywordだと分かち書きしないし、ik_smartとかもあるね。
- tokenizer filter:tokenizerが出力した単語をさらに処理する部分。例えば、大文字小文字変換、同義語処理、ピンイン処理とかだよ。

カスタムアナライザーを宣言する構文はこんな感じ。
| |
テストしてみよう。
| |
オートコンプリート検索
Elasticsearchはオートコンプリート機能を実現するために、 Completion Suggester という検索を提供してるんだ。このクエリは、ユーザーが入力した内容で始まる単語をマッチさせて返すよ。補完検索の効率を上げるために、ドキュメント内のフィールドタイプにはいくつか制約があるんだ。
- 補完検索に関わるフィールドはcompletionタイプである必要があるんだ。
- フィールドの内容は通常、補完に使われる複数の単語からなる配列だよ。
テスト用のインデックスを作成するよ。
| |
テストデータを挿入するよ。
| |
検索
| |
オートコンプリート Java
上記のDSLをJavaでリクエストするよ。
| |
レスポンスの処理だよ。
| |
ホテル検索のオートコンプリート
以前のhotelインデックスはピンインアナライザーが設定されてなかったんだ。でも、インデックスは変更できないから、削除して再構築する必要があるよ。
| |
HotelDocエンティティクラスを修正して、suggestionフィールドを追加するよ。
| |
データを再インポートするよ。
| |
検索テスト
| |
検索結果のsuggestionフィールドを確認できるはずだよ。そしたら、ビジネスコードを書こう。
Controller
| |
Service
| |