EP日本語設定

閲覧数: 273(1)

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

まずは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閑話, 公開タグ, , ,
ページナビのテキスト
2021年4月1日

記事ページの下部に前後の記事(投稿)へのリンクが表示される仕様なのだが、「カテゴリーに制限」をかけて  続きを読む

閲覧数まとめ
blank
2021年3月25日

閃きついでに総合計と週合計をフラグで制御する方式に変更してみた。これまではベタに関数をまるまるコピー  続きを読む

閃きは大事だw
blank
2021年3月23日

このサイトは、あくまでもCMSであるWordPressの構築やクラウドであるAWSの運用ノウハウ取得  続きを読む

ElasticPress 3.5.6
blank
2021年3月19日

マイナーバージョンアップにも関わらず、検索スコアリングのパラメータが微調整された結果、期待する検索結  続きを読む

管理画面を制限する
blank
2021年2月22日

このサイトではネット上のさまざまな攻撃からの防御のため、Wordfenceプラグインの無料版を使用し  続きを読む

検索精度を高める
blank
2020年11月1日

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

スポンサーリンク

コメントを残す

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