ElasticPress 4.3

閲覧数: 34(0)

ElasticPressは、WordPressでElasticsearchを使うためのプラグインという話は以前にも何回かしていて、Elasticsearch本体のバージョンアップや、ElasticPressのバージョンアップの際に、日本語を対象として使うならいろいろ手直しが必要だと書いてきました。メジャーバージョン3から4へのアップグレード時にはそれほど大きな対応は必要なく、以前の変更が有効だったのですが、今回の4.2から4.3へのアップグレードでは大きな変更が加えられており、従来の対策では期待した結果が得られない状況となりました。

まずはおさらいとしてElasticsearchでSudachi(日本語形態素解析プラグイン)を使う準備から。Elasticsearchのバージョンは6.8.23を使用します。「Sudachi公式」からプラグインのソースをダウンロードし、使用するバージョン(6.8.23)に対応したプラグインをビルドします。主要コマンドは以下の通り。

$ git clone https://github.com/WorksApplications/elasticsearch-sudachi.git
$ ./gradlew -PelasticsearchVersion=6.8.23 build
$ /usr/share/elasticsearch/bin/elasticsearch-plugin install file:///analysis-sudachi-6.8.23-2.1.0.zip

Elasticsearch側の準備が出来たら、WordPressのプラグインをインストールします。設定のページでは、自分のElasticsearchを使う指定をします。Elasticsearchに無事接続していることが確認出来たら、オリジナル(素の設定)のままインデックスを作成しエラーが出ないことを確認しておきます。

本題の修正です。修正するファイルはElasticsearchのバージョンによって異なります。今回のように6.8.23など、古いバージョンを使う際には「5-2.php」を修正します。7.10.2などの比較的新しいバージョンの場合は「7-0.php」を修正します。自分が使うElasticsearchのバージョンを確認しましょう。では、まずはマッピングから、の前にレプリカの設定を変えておかないとインデックスが「イエロー」になります。レプリカが一つ以上ある場合にはそのままで構いません。

//      'index.number_of_replicas'         => apply_filters( 'ep_default_index_number_of_replicas', 1 ),
        'index.number_of_replicas'         => apply_filters( 'ep_default_index_number_of_replicas', 0 ),

次に「Tokenizer」の設定を追加します。「analysis」と「analyzer」記述の間に追記する感じです。そして「analyzer」の「default」を「sudachi_tokenizer」に変更しておきます。

        'analysis' 
            'tokenizer' => array(
                'sudachi_tokenizer' => array(
                    'type' => 'sudachi_tokenizer',
                    'split_mode' => 'A',
                    'settings_path' => '/etc/elasticsearch/sudachi/sudachi.json',
            'analyzer'   => array(
                'default'          => array(
//                  'tokenizer'   => 'standard',
                    'tokenizer'   => 'sudachi_tokenizer',
                    'resources_path' => '/etc/elasticsearch/sudachi_dict',

デフォルトからの変更はありませんが、念の為「sudachi.json」の記述を以下に示します。

{
    "systemDict" : "system_full.dic",
    "inputTextPlugin" : [
        { "class" : "com.worksap.nlp.sudachi.DefaultInputTextPlugin" },
        { "class" : "com.worksap.nlp.sudachi.ProlongedSoundMarkInputTextPlugin",
          "prolongedSoundMarks": ["ー", "-", "⁓", "〜", "〰"],
          "replacementSymbol": "ー"}
    ],
    "oovProviderPlugin" : [
        { "class" : "com.worksap.nlp.sudachi.MeCabOovProviderPlugin" },
        { "class" : "com.worksap.nlp.sudachi.SimpleOovProviderPlugin",
          "oovPOS" : [ "補助記号", "一般", "*", "*", "*", "*" ],
          "leftId" : 5968,
          "rightId" : 5968,
          "cost" : 3857 }
    ],
    "pathRewritePlugin" : [
        { "class" : "com.worksap.nlp.sudachi.JoinNumericPlugin",
          "joinKanjiNumeric" : true },
        { "class" : "com.worksap.nlp.sudachi.JoinKatakanaOovPlugin",
          "oovPOS" : [ "名詞", "普通名詞", "一般", "*", "*", "*" ],
          "minLength" : 3
        }
    ]
}

この「setting path=/etc/elasticsearch/sudachi」の直下に「system_core.dic」が必要との記述もあり、念の為に配置します。「system_full.dic」は「resources_path」の指定通り「/etc/elasticsearch/sudachi_dict」に配置します。

「Sudachi」用に「filter」の設定を追加します。「split」「part_of_speach」「baseform」「ja_stop」「normalizedform」辺りを設定しておけば十分だと思います。

//                  'filter'      => apply_filters( 'ep_default_analyzer_filters', array( 'standard', 'ewp_word_delimiter', 'lowercase', 'stop', 'ewp_snowball' ) ),
                    'filter'      => apply_filters( 'ep_default_analyzer_filters', array( 'split', 'part_of_speech', 'baseform', 'ja_stop', 'normalizedform', 'ewp_word_delimiter', 'lowercase', 'stop', 'ewp_snowball' ) ),
                    /**
                     */
//                  'char_filter' => apply_filters( 'ep_default_analyzer_char_filters', array( 'html_strip' ) ),
                    'char_filter' => apply_filters( 'ep_default_analyzer_char_filters', array( 'html_strip', 'icu_normalizer', 'kuromoji_iteration_mark' ) ),
                    /**
            'filter'     => array(
                'split' => array(
                    'type' => 'sudachi_split',
                    'mode' => 'search',
                ),
                'part_of_speech' => array(
                    'type' => 'sudachi_part_of_speech',
                    'stoptags' => array( '助詞', '助動詞', '補助記号,句点', '補助記号,読点' ),
                ),
                'baseform' => array(
                    'type' => 'sudachi_baseform',
                ),
                'ja_stop' => array(
                    'type' => 'sudachi_ja_stop',
                    'stoptags' => array( '_japanese_', 'は', 'です' ),
                ),
                'normalizedform' => array(
                    'type' => 'sudachi_normalizedform',
                ),

これらの設定がうまくいけば、以下のような結果が得られるインデックスを作成することができます。「split(分割モード)」と「part_of_speach(品詞)」がうまく作用していて、最近のインデックス設定の中ではかなり気に入っている部類に入ります。

$ curl localhost:9200/arigatojp-post-1/_analyze?pretty -H "Content-Type: application/json" -d '{"analyzer":"default","text":"日本人のやすみはみじかいね"}'
{
  "tokens" : [
    {
      "token" : "日本",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "人",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "word",
      "position" : 1
    },
    {
      "token" : "休み",
      "start_offset" : 4,
      "end_offset" : 7,
      "type" : "word",
      "position" : 3
    },
    {
      "token" : "短い",
      "start_offset" : 8,
      "end_offset" : 12,
      "type" : "word",
      "position" : 5
    }
  ]
}

そしてもう一つ、今回のバージョンで大きく変更されたアルゴリズムの部分です。オリジナルの指定は「4.0」ですが、このアルゴリズムバージョンでは結果が絞られ過ぎるので「default」のアルゴリズムを使用するように修正します。

        public function get_search_algorithm( string $search_text, array $search_fields, array $query_vars ) : \ElasticPress\SearchAlgorithm {
//              $search_algorithm_version_option = \ElasticPress\Utils\get_option( 'ep_search_algorithm_version', '4.0' );
                $search_algorithm_version_option = \ElasticPress\Utils\get_option( 'ep_search_algorithm_version', 'default' );
カテゴリー公開, 閑話(IT)タグ, , , ,
テーマの日本語化

今回は単なる「翻訳」とかではなくて「文化的」な面での日本語化についての対応。今回の元になったテーマ「  続きを読む

関連記事プラグイン

脆弱性のため公開中止となったプラグインの代わりに選んだ、現在の「関連記事」用プラグインの設定を保存し  続きを読む

検索精度を高める

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

SWIPER実装編

Swiperの実装編、このサイトで実際に使っているJavaScriptの紹介です。 [code la  続きを読む

マイナーチェンジ

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

鬼門に再挑戦?

はい、またテーマ変えました。ガラッと。パソコンとスマホで表示の統一感を持たせるのに一苦労、MacとW  続きを読む

スポンサーリンク

コメントを残す

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