Dec 2nd, 2018: [JP][Elasticsearch] Analyze UIプラグインでAnalyzerの動きを理解する


(Jun Ohtani) #1

Analyzerの動きを理解することが、Elasticsearchの検索をよりよくする、検索にヒットしない理由を解析する近道だったりします。
素晴らしいことに、Elasticsearchには_analyze APIという便利なAPIが存在します。
既存のAnalyzerやカスタムAnalyzer(自分で定義したAnalyzer)を使用して、入力した文字列がどのようにTokenizeされて、転置インデックスのキーなるかというのを見ることができます。

ただ、便利なのですが、やはりREST APIでJSONでデータが返ってきます。
長い文章や多くの単語を含むような場合には、JSONを追いかけるのは少し大変になることもあります。

そこで、今回紹介するのが私が作成しているAnalyze UIプラグインです。

インストール

Kibanaのプラグインと開発しており、現時点で6.1.2から6.5.1までをサポートしています。
インストールは次のように行います。バージョン番号が2箇所(ディレクトリとZIPファイル名)に含まれますので、使用するバージョンに合わせて変更してからKibanaのディレクトリで実行してください。

./bin/kibana-plugin install https://github.com/johtani/analyze-api-ui-plugin/releases/download/6.5.0/analyze-api-ui-plugin-6.5.0.zip

インストールして、Kibanaを起動すると、メニューに「Analyze UI」(アイコンがないので、「A」という文字がアイコン)が追加されています。
「Analyze UI」メニューをクリックすると次のような画面が出てきます。

最も簡単な使い方

最も簡単な利用方法は、上記の2箇所に文字列とAnalyzerの名前を入力することです。
試しに、These are not the droids you are looking for.という文字列をenglish Analyzerでトークナイズしたらどうなるかをみてみましょう。「Analyze!」ボタンをクリックすると実行結果が現れます。

最初に出てくるのはAnalyzerがTokenizerした結果が表形式で出てきます。
その下には、KibanaのDevToolsのConsoleで実行できる形式も表示しています。
このプラグインがインストールされていない環境でも手軽に実行できるようになっています。

カスタムAnalyzer(自分でAnalyzerを組み立てる)

では次に、カスタムAnalyzerの結果を見てみるようにしましょう。
カスタムAnalyzerを使用するには、Textの入力ボックスの下にある「custom_analyzer」というタブをクリックします。

まずは、いくつか入力します。カスタムAnalyzer用の入力欄では、char_filterfilter の入力欄を、入力欄横の+または-ボタンで増減させることが可能です。
先ほどのenglish Analyzerと同じ挙動にする組み合わせを入力として設定してあります。
入力できたら「Analyze!」ボタンをクリックします。

出力結果が先ほどとは異なる、複数段になっています。custom_analyzerのタブでは、指定されたchar_filtertokenizerfilterの順番でそれぞれの処理結果を結果に順次表示するような仕組みになっています。
1段目はhtml_strip char filterの出力結果です。<em>タグが除去されているのがわかります。
2段目はstandard tokenizerの出力結果です。この段階では、まだ、lowercasestop filterなどが適用されていないので、大文字やストップワードが残っています。
最後のsnowball filterの出力結果を見ると、先ほどのenglish analyzerと同じ結果になっているのがわかります。
このように、自分で設定したカスタムAnalyzerについては、それぞれの処理の後にどのようにトークンが変更されているのかというのがわかりやすく表示されます。
この仕組みを使用することで、皆さんが設定しているAnalyzerが自分が望んだ挙動になっているかが簡単に確認できるわけです。

トークンの属性情報の表示

最後に、もう1つだけ便利な機能を紹介します。
特にkuromoji tokenizerやanalyzerを使用するときに便利な機能になります。
「Analyze!」ボタン横のスイッチ(Show all Token Attrs?)になります。Analyze後にこのスイッチをクリックすると、様々な情報がトークンに付随していることが見て取れる仕組みになります。

スイッチがオフの状態の場合は、「token」(実際の単語)と「position」(何単語目に出現したか?)の2種類のみが表示されていました。
スイッチをオンにすると、トークンに付随する様々な情報が全て表示されます。
この属性情報は、TokenizerやFilterによって追加される情報です。
Kuromojiでは、baseForm(基本形の単語。例では、「食べ」という単語の辞書にある基本形は「食べる」であることがわかる)や、partOfSpeech(品詞情報)、reading(読み)などがあることがわかります。
これらの情報を利用して、品詞による不要な単語の除去や、基本形を採用して表記揺れに対応するなどの検索の改善が行えます。

まとめ

簡単ですが、Analyze APIの紹介とAnalyze UI プラグインの紹介でした。
UI自体はAnalyze APIが持っている機能をGUIでわかりやすくしたものです。
うまく検索文字列がデータに対してヒットしない場合などに、Analyzerがどのように単語に区切っているかを理解していただくための助けになればと思います(ゆくゆくはKibana本体のDevToolsなどに取り込む予定です)。

バグなどを見つけた際は、GitHubへIssue登録をお願いいたします!