検索結果の期待値

閲覧数: 74(2)

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日】
カテゴリーIT閑話, 公開タグ, , , ,
検索精度を高める
2020年11月1日

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

ElasticPress日本語設定2020年版
blank
2020年10月29日

ElasticsearchをWordpressで利用するためのプラグインであるElasticPres  続きを読む

ElasticPress 3.5
blank
2020年10月22日

Elasticsearch用のプラグインであるElasticPressがメジャーバージョンアップ(3  続きを読む

Elasticsearch 6.8.11
blank
2020年10月2日

2017年末に「2.4.6」から「5.6.5」へバージョンアップして以来の大幅バージョンアップです。  続きを読む

パンくずリスト詳細
blank
2020年5月12日

テーマの「マイナーチェンジ」に伴って「パンくずリスト」の仕様を若干変更しました。一つ前のテーマではパ  続きを読む

カテゴリーを制限する
blank
2020年5月11日

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

コメントを残す

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