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)タグ, , ,
テーマリニューアル2017

すっかりご無沙汰してしまいました。 復帰記念に久しぶりにテーマを変更しました。今回使用するのは「ob  続きを読む

挙動不審なSwiper対策
blank

ここのトップページで「おすすめ記事」をスライダー形式で表示してくれているのが「Swiper」です。こ  続きを読む

検索結果のカテゴリー制限
blank

検索ネタを連発しておりますが、、、今回はテーマとプラグインどっちで修正するかという課題に挑戦しました  続きを読む

ElasticPress日本語設定201...
blank

ElasticsearchをWordPressで使用するために導入しているプラグイン「Elastic  続きを読む

鬼門
blank

俗語としての「鬼門」- Wikipediaより 鬼門は本来呪術的な意味を持つ言葉であるが、転じて「よ  続きを読む

Elasticsearch 6.8.11
blank

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

スポンサーリンク

コメントを残す

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