Match phrase prefix queryにてField値と同値で検索してもヒットしない

掲題のとおりです。Indexに格納済みの値と同値でMatch phrase prefix検索を行ってもヒットしないパターンがあり、現象について理解したく質問いたします。
よろしくお願いいたします。

バージョン:7.10

Mapping

PUT /my_index1
{
  "settings" : {
    "index": {
      "number_of_shards" : 1,
      "number_of_replicas" : 0,
      "analysis": {
        "analyzer": {
          "my_analyzer": {
            "type": "custom",
            "tokenizer": "kuromoji_tokenizer"
          }
        }
      }
    }
  },
  "mappings" : {
    "properties" : {
      "val0" : { "type" : "text", "analyzer" : "my_analyzer" }
    }
  }
}

データ投入

POST _bulk
{ "index" : { "_index" : "my_index1",  "_id" : "1" } }
{ "val0":"東関西国際空港ターミナル"}

検索クエリ

GET my_index1/_search
{
  "query": {
    "match_phrase_prefix": {
      "val0": "東関西国際空港ターミナル"
    }
  }
}

上記の手順で「東関西国際空港ターミナル」を登録したIndexに対して、同じ「東関西国際空港ターミナル」で検索をしてもヒットしないのは何故なのかがわかりません。

今回は、ヒットさせることが目的ではなく、このような検索結果となるのは何故なのか?を理解したいと考えております。現象を説明してくださる有識者がいらっしゃれば、どうぞよろしくお願いいたします。

はじめまして。
Kuromojiのオプションと、match phrase prefixが生成するクエリが影響しています。
Kuromojiデフォルトだとmode=searchとなっています(ドキュメント)。

この時、「関西国際空港」という単語が、「関西」「国際」「空港」と「関西国際空港」として出力されて、インデックスに登録されます。
この単語が出てきたときにフレーズのクエリを組み立てるときに、おかしな条件になり、うまくヒットしなくなるようです。

実際に投げられたクエリが内部的にどういう形になるのか?というのをValidate APIを利用することで見ることができます。

GET my_index1/_validate/query?explain=true
{
  "query": {
    "match_phrase_prefix": {
      "val0": "東関西国際空港ターミナル"
    }
  }
}

回避策として、"mode"="normal"をkuromoji_tokenizerで指定すれば、match_phrase_prefixが動くようにはなります。代わりに、「関西」などで検索しても「関西国際空港」はヒットできなくなります。

ご回答ありがとうございます。
そうなんですね…理解いたしました。 Validate APIは使用したことがなかったので、今後は活用していこうと思います。

勉強させていただきました。重ね重ね感謝いたします。

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.