検索結果の期待値

閲覧数: 83(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)タグ, , , , ,
ページナビ

いわゆるトップページで一覧表示する時や、シングルページで個別記事を表示する時に、ページ下部に「新しい  続きを読む

モバイルにも雪を!
blank

前回の「クリスマス'17始めました」では雪が降るのはPCのみでモバイルでは降りませんと宣言しましたが  続きを読む

子テーマ化詳細’18
blank

結局「今回も子テーマ化」してしまったので、それならそれでやりたい事はやっちゃいましょうという事で、ま  続きを読む

関連記事
blank

Related Postsと言うプラグインで、関連記事をページ下部に表示しています。これまでは、Wo  続きを読む

サイトのお引越し
blank

このサイトは2014年からAWS EC2上の「Amazon Linux」インスタンスで稼働していまし  続きを読む

dockerとproxy
blank

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

スポンサーリンク

コメントを残す

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