検索結果の期待値
WordPress標準の「検索」は入力された「検索ワード」をデータベースに直接照会する方法と言うのは以前の記事「検索に悩む」で説明した通りです。この方法の不都合は「検索ワード」に正確にヒットしないと検索結果が得られないことと、データベースへの負荷が高いこと。そこで「Elasticsearch」を導入して検索結果の精度向上とデータベースへの負荷低減を図ってきました。最近の記事である「Elasticsearch 5.6.5」ではバージョンアップに伴い使用するプラグインを変更する説明の中でマッピングの方法についても解説しました。
今回は、対象の検索ワードを「日本人としては長い夏休み」としてテストします。WordPress標準では完全一致が前提なので、例えば、記事中の文章が「日本人としては長かった夏休み」ではヒットしません。まずはElasticsearch標準の解析から。基本的に英語などのシングルバイト文字の事しか考えていないので一文字ずつ完全に分解してしまいます。
curl localhost:9200/_analyze?pretty -d '日本人としては長い夏休み' { "tokens" : [ { "token" : "日", "start_offset" : 0, "end_offset" : 1, "type" : "<IDEOGRAPHIC>", "position" : 0 }, { "token" : "本", "start_offset" : 1, "end_offset" : 2, "type" : "<IDEOGRAPHIC>", "position" : 1 }, { "token" : "人", "start_offset" : 2, "end_offset" : 3, "type" : "<IDEOGRAPHIC>", "position" : 2 }, { "token" : "と", "start_offset" : 3, "end_offset" : 4, "type" : "<HIRAGANA>", "position" : 3 }, { "token" : "し", "start_offset" : 4, "end_offset" : 5, "type" : "<HIRAGANA>", "position" : 4 }, { "token" : "て", "start_offset" : 5, "end_offset" : 6, "type" : "<HIRAGANA>", "position" : 5 }, { "token" : "は", "start_offset" : 6, "end_offset" : 7, "type" : "<HIRAGANA>", "position" : 6 }, { "token" : "長", "start_offset" : 7, "end_offset" : 8, "type" : "<IDEOGRAPHIC>", "position" : 7 }, { "token" : "い", "start_offset" : 8, "end_offset" : 9, "type" : "<HIRAGANA>", "position" : 8 }, { "token" : "夏", "start_offset" : 9, "end_offset" : 10, "type" : "<IDEOGRAPHIC>", "position" : 9 }, { "token" : "休", "start_offset" : 10, "end_offset" : 11, "type" : "<IDEOGRAPHIC>", "position" : 10 }, { "token" : "み", "start_offset" : 11, "end_offset" : 12, "type" : "<HIRAGANA>", "position" : 11 } ] }
これでは「精度」以前の結果しか得られません。そこで「Elasticsearch 5.6.5」で説明した「analysis-kuromoji」を使った日本語解析では、日本語の単語に分解してくれます。そして検索結果ではこれらの分解された「日本人」「長い」「夏休み」と言う単語にヒットする記事をサーチします。その際のヒット条件としては「OR」か「AND」が選択出来ます。「OR」を選択すると検索してくる記事数は増えますが「精度≒適合度」は落ちます。「AND」を選択すると「精度≒適合度」は上がりますが記事数は少なくなります。現在は「AND」が選ばれています。(ElasticPressの規定値は「OR」でした)
curl localhost:9200/wordpress/_analyze?pretty -d '日本人としては長い夏休み' { "tokens" : [ { "token" : "日本人", "start_offset" : 0, "end_offset" : 3, "type" : "word", "position" : 0 }, { "token" : "長い", "start_offset" : 7, "end_offset" : 9, "type" : "word", "position" : 3 }, { "token" : "夏休み", "start_offset" : 9, "end_offset" : 12, "type" : "word", "position" : 4 } ] }
本来の期待値としては「日本人としては長い夏休み」での検索ではなく、「日本人としては長い休み」と検索して、結果として「日本人としては長い夏休み」が含まれた記事と「日本人としては長い冬休み」を含む記事を表示して欲しかったのです。残念ながら現在の設定と「analysis-kuromoji」では実現出来ませんでした。そこで新しいプラグインである「analysis-sudachi」を試してみたのですが、「夏休み」を「夏休み」「夏」「休み」とは解析してはくれませんでした。「kuromoji」も「sudachi」も夏休みは「夏休み」の一語への解析でした。うーん残念。対処療法としては「日本人としては長い」で検索する事です。この件は引続き解決策を探します。
最終更新日: 2018年1月13日