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

**URL:** https://discuss.elastic.co/t/match-phrase-prefix-query-field/274703
**Category:** 日本語による質問・議論はこちら
**Created:** [June 2, 2021, 7:03am UTC](https://discuss.elastic.co/t/match-phrase-prefix-query-field/274703 "2021-06-02T07:03:20Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![b18bd8be4bf795b30ee7](https://avatars.discourse-cdn.com/v4/letter/b/3e96dc/32.png) [@b18bd8be4bf795b30ee7](https://discuss.elastic.co/u/b18bd8be4bf795b30ee7)
#### Post date: [June 2, 2021, 7:03am UTC](https://discuss.elastic.co/t/match-phrase-prefix-query-field/274703/1 "2021-06-02T07:03:20Z")

</div>

掲題のとおりです。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に対して、同じ「東関西国際空港ターミナル」で検索をしてもヒットしないのは何故なのかがわかりません。

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

---

<div class="post-metadata">

### Author: ![johtani](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/johtani/32/44956_2.png) [@johtani](https://discuss.elastic.co/u/johtani)
#### Post date: [June 3, 2021, 2:40am UTC](https://discuss.elastic.co/t/match-phrase-prefix-query-field/274703/2 "2021-06-03T02:40:45Z")

</div>

はじめまして。  
Kuromojiのオプションと、match phrase prefixが生成するクエリが影響しています。  
Kuromojiデフォルトだとmode=searchとなっています([ドキュメント](https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-kuromoji-tokenizer.html#analysis-kuromoji-tokenizer))。

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

実際に投げられたクエリが内部的にどういう形になるのか？というのを[Validate API](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-validate.html)を利用することで見ることができます。

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

```

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

---

<div class="post-metadata">

### Author: ![b18bd8be4bf795b30ee7](https://avatars.discourse-cdn.com/v4/letter/b/3e96dc/32.png) [@b18bd8be4bf795b30ee7](https://discuss.elastic.co/u/b18bd8be4bf795b30ee7)
#### Post date: [June 4, 2021, 12:55am UTC](https://discuss.elastic.co/t/match-phrase-prefix-query-field/274703/3 "2021-06-04T00:55:06Z")

</div>

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

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

---

<div class="post-metadata">

### Author: ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)
#### Post date: [July 2, 2021, 12:55am UTC](https://discuss.elastic.co/t/match-phrase-prefix-query-field/274703/4 "2021-07-02T00:55:47Z")

</div>

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