Elasticsearchをやっていると日々学びがありすぎる。しかし、それを毎回いい感じにまとめるのは大変すぎるので、とりあえずいろいろ整理がつくまで雑に今日の学びとしてまとめていきたい。
さて今日はanalyzer周りについて学んだ。
AnalyzerはTokenizer, TokenFilter, CharFilterから成り立つ
AnalyzerはTokenizer, TokenFilter, CharFilterから成り立つ。ドキュメントはText analysis | Elasticsearch Guide [8.0] | Elastic や Analysis and Analyzers | Elasticsearch: The Definitive Guide [2.x] | Elastic あたりが参考になる。
Analyzers are composed of a single Tokenizer and zero or more TokenFilters. The tokenizer may be preceded by one or more CharFilters.
と書いてあるとおり、Tokenizerは1つ、TokenFilterは0以上、CharFiltersも1以上指定することもできる。CharFiltersの記述がわかりにくいけど、つまり0以上指定できるということなのかな?
この3つがどのように関係しているかは こちら を参照すると載っている。
- 文字列を渡すと、CharFilter -> Tokenizer -> TokenFilterの順で処理される
- CharFilterはまず文書全体を処理する
- 例: HTML除去など
- Tokenizerは文字列をtermに分割する
- TokenFilterは個々のtermを処理する
- 例: 助詞の除去など
ICU Analysis PluginでNFKC正規化ができる
検索の精度を上げるために、半角全角統一とか、小文字統一とかを行いたい時がある。この場合はICU Analysis Pluginを使うといい。
- ICU Analysis Plugin | Elasticsearch Plugins and Integrations [8.0] | Elastic
- Elasticsearch 日本語形態素解析のための文字列正規化の重要性 | by Kunihiko Kido | Hello! Elasticsearch. | Medium
ICU Normalization Character Filter というのを利用すれば、Tokenizeの前に一回NFKC正規化してくれるので、トークナイズの精度も上がる。
このCharFilterのデフォルトではnfkc_cfという形式での正規化がかけられている。nfkc_cfを使えば、小文字統一とNFKC正規化をかけてくれるみたい(?)だった。NFKC正規化はUnicode正規化とか文字列の表記揺れをUnicode正規化で簡単に解決する方法 - Qiitaとかを見てもらえば良さそう。
以上から、とりあえず日本語検索をするにはICU Normalization Character Filterをかけておけば良いという結論に至った。
analysisの設定について
雑に学んだことを書いておく。
- create index APIでanalysisの設定も出来る
- Analyzer, Tokenizer, TokenFilter, CharFilter全て自分で名前を付けて定義できる
- analyzerのtype customを利用すれば自分でTokenizer, TokenFilter, CharFilterを組み合わせてAnalyzerを定義できる
- kuromoji_tokenizerの、search modeを使えば、いい感じに日本語を検索用にtokenizeしてくれる
- kuromoji_part_of_speech token filterを使えば、助詞とかのあまり検索に役立たない品詞を除去してくれる
- Keyword Tokenizerを使うと、渡したものを特にトークナイズせずにそのまま1つのtermとして出力してくれる