ElasticPress日本語設定
前回の「検索結果の期待値」では「日本人としては長い休み」で検索出来ないと言うところまで話をしました。今回はこの課題を解決して行きたいと思います。
まずはElasticPressを日本語で使うための設定の再確認です。「Elasticsearch 5.6.5」で基本的な使い方の説明はしましたが、この設定では原始的な使い方しかサポート出来ません。ちゃんと日本語を扱うためには、半角・全角、長音、漢数字対応などなど、いろいろ細かい設定が必要です。順番に見て行きましょう。
まずこれらの細かい設定をサポートするElasticsearchプラグインの追加からです。前回はとりあえず「analysis-kuromoji」を入れました。今回は追加で「analysis-icu」をインストールします。インストール後、Elasticsearchの再起動が必要です。
curl localhost:9200/_nodes/plugins?pretty { "_nodes" : { "total" : 1, "successful" : 1, "failed" : 0 }, "cluster_name" : "elasticsearch", "nodes" : { "hN7Mo5mwQz-jC8CU67vSPQ" : { "name" : "hN7Mo5m", "transport_address" : "127.0.0.1:9300", "host" : "127.0.0.1", "ip" : "127.0.0.1", "version" : "5.6.5", "build_hash" : "6a37571", "roles" : [ "master", "data", "ingest" ], "plugins" : [ { "name" : "analysis-icu", "version" : "5.6.5", "description" : "The ICU Analysis plugin integrates Lucene ICU module into elasticsearch, adding ICU relates analysis components.", "classname" : "org.elasticsearch.plugin.analysis.icu.AnalysisICUPlugin", "has_native_controller" : false },
「analysis-kuromoji」と「analysis-icu」を使うための最終的な設定は以下の通り。
-----<中略>----- 'analysis' => array( 'analyzer' => array( 'default' => array( 'tokenizer' => 'kuromoji_tokenizer', 'char_filter' => array( 'icu_normalizer', 'kuromoji_iteration_mark' ), 'filter' => array( 'kuromoji_baseform', 'kuromoji_part_of_speech', 'kuromoji_number', 'kuromoji_stemmer', 'ja', 'standard', 'ewp_word_delimiter', 'lowercase', 'ewp_snowball', 'ngram' ), -----<中略>----- 'filter' => array( 'kuromoji_baseform' => array( 'type' => 'kuromoji_baseform' ), 'kuromoji_part_of_speech' => array( 'type' => 'kuromoji_part_of_speech' ), 'kuromoji_number' => array( 'type' => 'kuromoji_number', ), 'kuromoji_stemmer' => array( 'type' => 'kuromoji_stemmer' ), 'ja' => array( 'type' => 'ja_stop', 'stopwords' => ['_japanese_'], ), -----<中略>----- 'ngram' => array( 'type' => 'ngram', 'min_gram' => 2, 'max_gram' => 3, 'token_charas' => array( 'letter', 'digit' ), ),
検索用のAPIでは「OR」条件を「AND」条件にして検索結果をより絞り込む方向で設定しています。
array( 'multi_match' => array( 'query' => '', 'fields' => $search_fields, 'boost' => apply_filters( 'ep_match_boost', 2, $search_fields, $args ), // 'fuzziness' => 0, 'operator' => 'and', ) ), array( 'multi_match' => array( 'fields' => $search_fields, 'query' => '', // 'fuzziness' => apply_filters( 'ep_fuzziness_arg', 1, $search_fields, $args ), 'operator' => 'and', ), )
前回「kuromoji」を追加した、日本語検索対象フィールド「post_title」「post_excerpt」「post_content」を「kuromoji」から「default」へ変更します。
'post_title' => array( 'type' => 'text', 'fields' => array( 'post_title' => array( 'type' => 'text', // 'analyzer' => 'standard', 'analyzer' => 'default', ), 'post_excerpt' => array( 'type' => 'text', 'analyzer' => 'default', ), 'post_content' => array( 'type' => 'text', 'analyzer' => 'default', ),
今回は細い設定をいっぺんに入れたのでわかりにくくなっていますが、対応したのは「半角・全角」「漢数字」「長音」「N-gram」です。例えば「ボーイング」は「ボーイング」でも検索出来ます。「ボーイング787」は「ボーイング七八七」でも検索可能です。そして「日本人としては長い休み」で検索すると「日本人としては長い夏休み」と「日本人としては長かった冬休み」の両方を結果として返します。「プリンター」も「プリンタ」で検索出来ます。今回の設定で検索でやりたかったことがだいたい出来たような気がします。この設定でしばらく様子を見たいと思います。これらの設定はインデックスが増えるので容量を食うと言うデメリットがあるのは仕方ありません。
最終更新日: 2021年4月4日