ElasticPress日本語設定

閲覧数: 261(0)

前回の「検索結果の期待値」では「日本人としては長い休み」で検索出来ないと言うところまで話をしました。今回はこの課題を解決して行きたいと思います。

まずは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」は「ボーイング七八七」でも検索可能です。そして「日本人としては長い休み」で検索すると「日本人としては長い夏休み」と「日本人としては長かった冬休み」の両方を結果として返します。「プリンター」も「プリンタ」で検索出来ます。今回の設定で検索でやりたかったことがだいたい出来たような気がします。この設定でしばらく様子を見たいと思います。これらの設定はインデックスが増えるので容量を食うと言うデメリットがあるのは仕方ありません。

【最終更新日: 2018年5月24日】
カテゴリーIT閑話, 公開タグ, , ,
検索精度を高める
2020年11月1日

検索ネタを連発するのはElasticsearchやElasticPresがバージョンアップした時のお  続きを読む

ElasticPress日本語設定2020年版
blank
2020年10月29日

ElasticsearchをWordpressで利用するためのプラグインであるElasticPres  続きを読む

ElasticPress 3.5
blank
2020年10月22日

Elasticsearch用のプラグインであるElasticPressがメジャーバージョンアップ(3  続きを読む

Elasticsearch 6.8.11
blank
2020年10月2日

2017年末に「2.4.6」から「5.6.5」へバージョンアップして以来の大幅バージョンアップです。  続きを読む

パンくずリスト詳細
blank
2020年5月12日

テーマの「マイナーチェンジ」に伴って「パンくずリスト」の仕様を若干変更しました。一つ前のテーマではパ  続きを読む

カテゴリーを制限する
blank
2020年5月11日

過去に何度も書いた「カテゴリー制限」の話、元はと言えば初期に書かれた「非公開」の記事が原因です。トッ  続きを読む

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください