ElasticPress 4.3

閲覧数: 35(1)

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' );

最終更新日: 2022年11月5日

カテゴリー公開, 閑話(IT)タグ, , , ,
閲覧数を記録してみる

いろいろ便利なプラグインがあるので、いくつか試してみて、最終的に採用したのが、Post Views  続きを読む

名前解決
blank

バージョン5からのWordpressが「ツール」で提供している「サイトヘルス」という機能でサイトの健  続きを読む

最近のいろいろ
blank

先日の記事で「写真を整理」していたら、、、という話をしましたが。不要な写真もありストレージ容量を確保  続きを読む

テーマの日本語化
blank

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

カテゴリーを制限する
blank

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

サイトのお引越し
blank

このサイトは2014年からAWS EC2上の「Amazon Linux」インスタンスで稼働していまし  続きを読む

スポンサーリンク

コメントを残す

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