ElasticPress日本語設定

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

【最終更新日: 2021年4月4日】
カテゴリー公開, 閑話(IT)タグ, , ,
検索精度を高める

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

トリミング3
blank

先日から投稿ページ下部に、関連記事を表示するプラグインを導入しました。人気プラグインである、Word  続きを読む

アクセシビリティ対策
blank

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

google fontsのlocal化
blank

google fontsの使い方では「web fonts」の使い方を簡単に説明しました。結果的に以下  続きを読む

クリスマス始めました
blank

Christmas Plugin、今年はクリスマスライトではなくて、クリスマスボールです。ちょっとフ  続きを読む

カテゴリー制限
blank

カテゴリー制限はこのサイトでは過去に何度も出題された「頻出過去問題」です。初期の頃は「Allow C  続きを読む

スポンサーリンク

コメントを残す

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