# フレーズ検索時に展開された類義語をfvhでハイライトしたい

**URL:** <https://discuss.elastic.co/t/fvh/193433>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [August 2, 2019, 2:07am UTC](https://discuss.elastic.co/t/fvh/193433 "2019-08-02T02:07:16Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![begin](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/begin/32/98916_2.png) [@begin](https://discuss.elastic.co/u/begin)\
**Post date:** [August 2, 2019, 2:07am UTC](https://discuss.elastic.co/t/fvh/193433/1 "2019-08-02T02:07:16Z")

</div>

Elasticsearch:7.3.0です。  
phrase検索時、synonym\_graphで展開された類義語がfvhでhighlightされません。

下記の検索クエリにおいて、いずれかの部分を書き換えるとハイライトがつきます。  
・単純なMatchクエリでは、類義語もfvhでhighlightされる。(match\_phrase→match)  
・類義語以外はfvhでhighlightされる。("value": "ケータイ"→"value": "製品")  
・typeがunifiedやplainではhighlightされる。("type": "fvh"→"type": "unified")

設定等に誤りがあるようであれば、ご指摘いただけると幸いです。  
※問題を簡略化するために省いていますが、highlightでmatched\_fieldsを使いたいため、fvhを使用しています。

以下、設定とデータ投入、検索クエリです。  
・設定

```
PUT test/
{
  "settings": {
    "index": {
      "number_of_shards": "1",
      "number_of_replicas": 0,
      "analysis": {
        "filter": {
          "synonym_graph": {
            "type": "synonym_graph",
            "synonyms": [
              "ケータイ,携帯電話"
            ]
          }
        },
        "analyzer": {
          "kuromoji": {
            "type": "custom",
            "tokenizer": "kuromoji_tokenizer"
          },
          "kuromoji_synonym_graph": {
            "type": "custom",
            "tokenizer": "kuromoji_tokenizer",
            "filter": [
              "synonym_graph"
            ]
          }
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "value": {
        "type": "text",
        "analyzer": "kuromoji",
        "search_analyzer": "kuromoji_synonym_graph",
        "term_vector": "with_positions_offsets"
      }
    }
  }
}

```

・データ投入

```
POST test/_doc/
{
  "value":"ケータイ（フィーチャーフォン）の製品紹介ページ。"
}
POST test/_doc/
{
  "value":"スマートフォン（スマホ）・携帯電話・モバイルのページ。"
}
POST test/_doc/
{
  "value":"普段電話をポケットに入れて携帯しています。"
}

```

・検索クエリ

```
GET test/_search
{
  "query": {
    "match_phrase": {
      "value": "ケータイ"
    }
  },
  "highlight": {
    "order": "score",
    "fragment_size": 100,
    "number_of_fragments": 1,
    "fields": {
      "value": {
        "type": "fvh"
      }
    }
  }
}

```

・レスポンス

```
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 2.2241263,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "EIADUGwBPMnEznS6qQ_M",
        "_score" : 2.2241263,
        "_source" : {
          "value" : "ケータイ（フィーチャーフォン）の製品紹介ページ。"
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "EYADUGwBPMnEznS6rw9p",
        "_score" : 1.9208363,
        "_source" : {
          "value" : "スマートフォン（スマホ）・携帯電話・モバイルのページ。"
        }
      }
    ]
  }
}
```

---

<div class="post-metadata">

**Author:** ![tsgkdt](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/tsgkdt/32/39151_2.png) [@tsgkdt](https://discuss.elastic.co/u/tsgkdt)\
**Post date:** [August 2, 2019, 8:27am UTC](https://discuss.elastic.co/t/fvh/193433/2 "2019-08-02T08:27:22Z")

</div>

こんにちわ

> **[Request body search | Elasticsearch Guide \[8.11\] | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html#request-body-search-highlighting)**

ここによれば、fvhはspanクエリを未サポートとあります。

> The `fvh` highlighter does not support span queries. If you need support for span queries, try an alternative highlighter, such as the `unified` highlighter.

いま、お示しいただいたようなmatch\_phraseを使って、そのフィールドにsynonym\_graphが入っていた場合、  
クエリプロファイラーで見てみると、SpanOrQueryが使われているように見えます。

 ![image](https://us1.discourse-cdn.com/elastic/original/3X/7/b/7b78b5e3e229b1746eb2ee6711789826529c42c2.png)

fvhではSpanクエリが未サポートというwarningの内容からすると、  
設定はあっているんだけれども、match\_phrase、synonym\_graph、fvhの組み合わせであるために、  
SpanOrQueryとなって、ハイライトが出ないのでは？ というところまで想像しました。

これならmatchクエリにしたとき、あるいはハイライトをunifiedにしたときは期待した結果になるということの説明ができそうです・・・

力不足でスバリな回答でなくてすみません。

---

<div class="post-metadata">

**Author:** ![begin](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/begin/32/98916_2.png) [@begin](https://discuss.elastic.co/u/begin)\
**Post date:** [August 2, 2019, 10:54am UTC](https://discuss.elastic.co/t/fvh/193433/3 "2019-08-02T10:54:42Z")

</div>

返信ありがとうございます。

SpanOrQueryに展開されているのは確認していたのですが、ドキュメントのwarningを見落としていました。

現在は制限事項みたいなので、どういう実装にするか改めて考えてみたいと思います。

---

<div class="post-metadata">

**Author:** ![begin](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/begin/32/98916_2.png) [@begin](https://discuss.elastic.co/u/begin)\
**Post date:** [August 5, 2019, 5:20am UTC](https://discuss.elastic.co/t/fvh/193433/4 "2019-08-05T05:20:46Z")

</div>

match\_phraseクエリでも、slopを指定すると、spanクエリに展開されないことが分かりました。  
highlight\_queryでslopを1にすると、fvhでも類義語がハイライトされます。  
ただし、「携帯する電話」等、間に1単語ある部分もslopが1なのでハイライトされてしまいますが・・・

・追加データ

```
POST test/_doc/
{
  "value":"ケータイとは、携帯する電話のこと。"
}

```

・検索クエリ

```
GET test/_search
{
  "query": {
    "match_phrase": {
      "value": "ケータイ"
    }
  },
  "highlight": {
    "highlight_query": {
      "match_phrase": {
        "value": {
          "query": "ケータイ",
          "slop": 1
        }
      }
    },
    "order": "score",
    "fragment_size": 100,
    "number_of_fragments": 1,
    "fields": {
      "value": {
        "type": "fvh"
      }
    }
  }
}

```

・レスポンス

```
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.614013,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "VcskYGwBVWXkRLLoonrS",
        "_score" : 1.614013,
        "_source" : {
          "value" : "ケータイ（フィーチャーフォン）の製品紹介ページ。"
        },
        "highlight" : {
          "value" : [
            "<em>ケータイ</em>（フィーチャーフォン）の製品紹介ページ。"
          ]
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "WMslYGwBVWXkRLLoanop",
        "_score" : 1.4576079,
        "_source" : {
          "value" : "ケータイとは、携帯する電話のこと。"
        },
        "highlight" : {
          "value" : [
            "<em>ケータイ</em>とは、<em>携帯</em>する<em>電話</em>のこと。"
          ]
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "VsskYGwBVWXkRLLoqHrs",
        "_score" : 1.3902473,
        "_source" : {
          "value" : "スマートフォン（スマホ）・携帯電話・モバイルのページ。"
        },
        "highlight" : {
          "value" : [
            "スマートフォン（スマホ）・<em>携帯電話</em>・モバイルのページ。"
          ]
        }
      }
    ]
  }
}
```

---

<div class="post-metadata">

**Author:** ![tsgkdt](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/tsgkdt/32/39151_2.png) [@tsgkdt](https://discuss.elastic.co/u/tsgkdt)\
**Post date:** [August 5, 2019, 6:12am UTC](https://discuss.elastic.co/t/fvh/193433/6 "2019-08-05T06:12:47Z")

</div>

うっかり誤った返信してしまったので前の投稿は消しました。すみません。

---

<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:** [September 2, 2019, 6:12am UTC](https://discuss.elastic.co/t/fvh/193433/7 "2019-09-02T06:12:49Z")

</div>

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