ElasticPress日本語設定

閲覧数: 257(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年5月12日

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

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

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

マイナーチェンジ
blank
2020年3月23日

かれこれ一年近くほったらかしだったので、気合をいれて「テーマ変更」と思っていたのですが、、、いろいろ  続きを読む

6月の検索ワードまとめ
blank
2019年6月30日

6月の検索ワードのまとめです。 意外なところで「zabbixダウングレード」が複数回検索され、単独の  続きを読む

アクセシビリティ対策
blank
2019年6月23日

テーマカスタマイズの一環で、トップページに一覧表示されている「写真を左右交互に表示する」ようにした際  続きを読む

dockerとproxy
blank
2019年6月18日

dockerやdocker-composeをプロキシ環境下で使うのに苦労したので忘れないようにメモし  続きを読む

コメントを残す

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