検索結果の期待値

閲覧数: 88(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閑話, 公開タグ, , , , ,
祝リニューアル

かなり大胆に、動きを変えました。鬼門でしょうかw まず、トップページで表示されるカテゴリーを「IT閑  続きを読む

MIXED CONTENTS
blank

このサイトは「https化」しています。そのため通信は暗号化されていてインターネット通信の途中で情報  続きを読む

いまさらdotproject、続き
blank

前回(これ)は古いオープンソースのプロジェクトマネジメントツール導入の話でした。当時PHPは5.3で  続きを読む

6月の検索ワードまとめ
blank

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

Tsubopedia
blank

先日、Tsubopedia用のmediawikiを1.25.1へバージョンアップしたばかりなんだが、  続きを読む

テーマリニューアル2017
blank

すっかりご無沙汰してしまいました。 復帰記念に久しぶりにテーマを変更しました。今回使用するのは「ob  続きを読む

スポンサーリンク

コメントを残す

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