ElasticPress 3.0
ここのところElasitcsearch関連の話が多いなと思っていたら「ElasticPress」がバージョンアップ(3.0)したことに伴い、またまたElasticsearch関連の話題となりました。今回はメジャーバージョンアップ(2->3)のようでフォルダ構成なども変わっています。これまでプラグインルートに存在したclassesがincludesの下に移動しさらに中のフォルダ構成も大きく変わっています。
drwxr-xr-x 4 www-data 4096 May 14 20:45 assets/ -rw-r--r-- 1 www-data 10137 May 14 20:45 composer.lock drwxr-xr-x 4 www-data 4096 May 14 20:45 dist/ -rw-r--r-- 1 www-data 5811 May 14 20:45 elasticpress.php drwxr-xr-x 2 www-data 4096 May 14 20:45 images/ drwxr-xr-x 5 www-data 4096 May 14 20:45 includes/ drwxr-xr-x 2 www-data 4096 May 14 20:45 lang/ -rw-r--r-- 1 www-data 361175 May 14 20:45 package-lock.json -rw-r--r-- 1 www-data 32789 May 14 20:45 readme.txt -rw-r--r-- 1 www-data 2217 May 14 20:45 uninstall.php
「マッピング」は従来通りincludesの下ですがmapping以下が大きく変わってpostとuserというフォルダ構成になりました。これは設定でマッピングのユーザーによる指定が可能になるための変更のようですが、マッピングの「言語」対応と合わせてバージョン3の目玉のようなのですが、残念ながら「日本語」に対しては全く機能していませんでした。ということで、いつものようにコアを直接変更します。この辺は完全に自己責任です。
return array(
'settings' => array(
'index.mapping.total_fields.limit' => apply_filters( 'ep_total_field_limit', 5000 ),
'index.max_result_window' => apply_filters( 'ep_max_result_window', 1000000 ),
'analysis' => array(
'analyzer' => array(
'default' => array(
// 'tokenizer' => 'standard',
'tokenizer' => 'sudachi_tokenizer',
// 'filter' => array( 'standard', 'ewp_word_delimiter', 'lowercase', 'stop', 'ewp_snowball' ),
'filter' => array( 'part_of_speech', 'baseform', 'ja_stop', 'normalizedform', 'standard', 'ewp_word_delimiter', 'lowercase', 'stop', 'ewp_snowball' ),
// 'char_filter' => array( 'html_strip' ),
'char_filter' => array( 'html_strip', 'icu_normalizer', 'kuromoji_iteration_mark' ),
'language' => apply_filters( 'ep_analyzer_language', 'english', 'analyzer_default' ),
),
'shingle_analyzer' => array(
'type' => 'custom',
'tokenizer' => 'standard',
'filter' => array( 'lowercase', 'shingle_filter' ),
),
'ewp_lowercase' => array(
'type' => 'custom',
'tokenizer' => 'keyword',
'filter' => array( 'lowercase' ),
),
),
'filter' => array(
'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',
),
'shingle_filter' => array(
'type' => 'shingle',
'min_shingle_size' => 2,
'max_shingle_size' => 5,
),
'ewp_word_delimiter' => array(
'type' => 'word_delimiter',
'preserve_original' => true,
),
'ewp_snowball' => array(
'type' => 'snowball',
'language' => apply_filters( 'ep_analyzer_language', 'english', 'filter_ewp_snowball' ),
),
'edge_ngram' => array(
'side' => 'front',
'max_gram' => 10,
'min_gram' => 3,
'type' => 'edgeNGram',
),
),
'normalizer' => array(
'lowerasciinormalizer' => array(
'type' => 'custom',
'filter' => array( 'lowercase', 'asciifolding' ),
),
),
),
'number_of_replicas' => 0,
),
検索用のAPIはclassesの下ですが、以前の「class-ep-api.php」から大きく変わって「elasticpress/includes/classes/Indexable/Post」の下の「Post.php」となりました。「fuzziness」の設定が検索結果を汚くしていたのでコメント化してしまいます。この辺の精度は「Sudachi」の辞書頼りです。
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 ),
),
),
新バージョンではインデックス名が変更されたのでサーバー上に新たなインデックスを作成しますが旧バージョンのインデックスを残したままの大変残念な仕様となっていますので新バージョンの稼動確認出来たら手でインデックスを削除する必要があります。
curl localhost:9200/_cat/indices?v health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open arigatojp-1 W9UisYw2SVqQk3I2abVeYA 5 0 536 0 7.8mb 7.8mb green open arigatojp-post-1 DrtFyb7STou7mK072AApbg 5 0 536 0 7.4mb 7.4mb
「-1」が旧バージョンのインデックスで「-post-1」が新バージョンのインデックスです。ちなみにUser設定を使用すると「-user」となるようです。何れにしても個人的には古いインデックスを残す謎の仕様です。
最終更新日: 2020年10月22日