検索の精度を上げるアプローチの仕方

お世話になっております。
現在ElasticCloudを利用し、全文検索の構築を行っております。

掲題の通り、検索の精度についての質問です。

ex)

探したいワード:渋谷ヒカリエ

上記にでヒットすることがきる検索ワード
・渋谷
・ヒカリ
・エ

トークナイズ(kuromoji)の結果が上のように分割されているため

ヒカリエ

という検索ワードでヒットさせてことができません。
渋谷ヒカリエはほんの例で、最近の言葉や人名に対応させるためには通常辞書のインポート等必要になるかと思っています。

ElasticCloudの利用(クレカ登録で正式利用)では、気軽に辞書のインポートができないという認識なのですが、こういった検索精度をあげたい場合のアプローチはどのようなものがあるかご教授して頂きたいです。

抜粋になりますが、analysisの設定は下記のようにしてます。

        "analysis": {
          "filter": {
            "greek_lowercase_filter": {
              "type": "lowercase",
              "language": "greek"
            },
            "pos_filter": {
              "type": "kuromoji_part_of_speech",
              "stoptags": [
                "助詞-格助詞-一般",
                "助詞-終助詞"
              ]
            }
          },
          "analyzer": {
            "kuromoji_analyzer": {
              "filter": [
                "kuromoji_baseform",
                "pos_filter",
                "greek_lowercase_filter",
                "cjk_width"
              ],
              "type": "custom",
              "tokenizer": "kuromoji_tokenizer"
            }
          }

辞書以外にもなにかうまい方法がないかもなにかございましたらよろしくお願いします。

フレーズ検索をすれば、「ヒカリエ」で検索できると思うのですが。

どういった検索クエリを投げているのでしょうか?

1 Like

ご返答ありがとうございます。
検索クエリは下記になります

{
  "query" : {
    "simple_query_string" : {
      "fields": ["address"],
      "query": "ヒカリエ"
    }
  }
}

mapping

{
    "_all": {
        "enabled": false
    }, 
    "_source": {
        "enabled": true
    }, 
    "properties": {
        "address": {
            "analyzer": "kuromoji_analyzer", 
            "index": "analyzed", 
            "store": true, 
            "type": "string"
        }
    }
}

よろしくお願いします。

simple_query_stringdefault_operatorがORになっています

例えば「ヒカリエ」と入れた場合、最初に書かれていたように「ヒカリ」「エ」で分割されて、ORで検索されるので、うまく検索できないと感じられたと思います。
simple_query_stringの場合、「"」を利用することで、フレーズ検索にすることができます。
その他のSyntaxはこちらを参照のこと)
この場合、「ヒカリ」「エ」で分割される場合の対応はできます。

ただ、辞書にない単語に関してはこれだけでは対応できない場合があるかと思います(予期しないトークナイズが発生するためにうまく検索できないなど)。

今回の質問の「精度」とはおそらく「再現率」の話だと思います。
よりヒットしてもらう必要があると思いますので、n-gramなどと併用して検索漏れを無くす方向で対応してみるのはどうでしょうか?

1 Like

ご回答ありがとうございます。
フレーズ検索やn-gramなどの併用を考えます。

ありがとうございました