ElasticPress 3.5
Elasticsearch用のプラグインであるElasticPressがメジャーバージョンアップ(3.5)しました。とりあえずそのまま使ってみましたが、残念ながら下位互換が無く、インデックスを作成する方は従来の設定で期待した結果が得られましたが、検索の方はそのままでは期待した結果が得られませんでした。
* Filter default post search fields * * @hook ep_search_fields * @param {array} $search_fields Default search fields * @param {array} $args WP Query arguments * @return {array} New defaults */ $search_fields = apply_filters( 'ep_search_fields', $search_fields, $args ); $search_algorithm_version = apply_filters( 'ep_search_algorithm_version', '3.5' ); $search_text = ( ! empty( $args['s'] ) ) ? $args['s'] : ''; if ( '3.5' === $search_algorithm_version ) { $query = array( 'bool' => array( 'should' => array( array( 'multi_match' => array( 'query' => $search_text, // 'type' => 'phrase', 'type' => 'best_fields', 'fields' => $search_fields, /** * Filter boost for post match phrase query * * @hook ep_match_phrase_boost * @param {int} $boost Phrase boost * @param {array} $prepared_search_fields Search fields * @param {array} $query_vars Query variables * @return {int} New phrase boost */ 'boost' => apply_filters( 'ep_match_phrase_boost', 3, $search_fields, $args ), ), ), array( 'multi_match' => array( 'query' => $search_text, 'fields' => $search_fields, 'type' => 'phrase', 'slop' => 5, ), ), ), ), ); } else {
バージョン3.5で新たに追加された部分であるMulti-matchの「type」指定の値を「phrase」から「best_fields」に変更します。デフォルトが「best_fields」なので「type」指定をコメントアウトするだけで良いとは思いますが、ここは念のため明示的に「best_fields」指定とします。「phrase」指定では文字列を完全一致で検索するようなので部分一致でも検索できる仕様への変更です。個人的にはもう少し絞り込みたいところではありますが、とりあえず現状はこれでOKとして引き続き調査を進めたいと思います。
インデックスの作成の方は「従来」の手法です。また、検索でヒットした単語をハイライトする機能が追加されましたが、日本語(マルチバイト)対応されていないため、表示が崩れる場合があるのでこれも無効に設定しました。せっかくのメジャーバージョンアップでしたが、追加された機能がほぼ使えないという残念な状態になってしまいました。もともと日本語(マルチバイト)対応していないようだったので想定内ではありますが。。。
「sudachi_tokenizer」を指定した日本語分かち書きの確認です。
curl -XGET 'http://localhost:9200/arigatojp-post-1/_analyze?pretty' -H "Content-Type: application/json" -d '{ "tokenizer": "sudachi_tokenizer", "text": "日本人としては長い休み" }' { "tokens" : [ { "token" : "日本人", "start_offset" : 0, "end_offset" : 3, "type" : "word", "position" : 0 }, { "token" : "と", "start_offset" : 3, "end_offset" : 4, "type" : "word", "position" : 1 }, { "token" : "し", "start_offset" : 4, "end_offset" : 5, "type" : "word", "position" : 2 }, { "token" : "て", "start_offset" : 5, "end_offset" : 6, "type" : "word", "position" : 3 }, { "token" : "は", "start_offset" : 6, "end_offset" : 7, "type" : "word", "position" : 4 }, { "token" : "長い", "start_offset" : 7, "end_offset" : 9, "type" : "word", "position" : 5 }, { "token" : "休み", "start_offset" : 9, "end_offset" : 11, "type" : "word", "position" : 6 } ] }