検索結果の期待値

閲覧数: 69(0)

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年5月12日

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

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

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

マイナーチェンジ
blank
2020年3月23日

かれこれ一年近くほったらかしだったので、気合をいれて「テーマ変更」と思っていたのですが、、、いろいろ  続きを読む

6月の検索ワードまとめ
blank
2019年6月30日

6月の検索ワードのまとめです。 意外なところで「zabbixダウングレード」が複数回検索され、単独の  続きを読む

アクセシビリティ対策
blank
2019年6月23日

テーマカスタマイズの一環で、トップページに一覧表示されている「写真を左右交互に表示する」ようにした際  続きを読む

dockerとproxy
blank
2019年6月18日

dockerやdocker-composeをプロキシ環境下で使うのに苦労したので忘れないようにメモし  続きを読む

コメントを残す

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