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

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" : "スマートフォン(スマホ)・携帯電話・モバイルのページ。"
        }
      }
    ]
  }
}

こんにちわ

ここによれば、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が使われているように見えます。

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

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

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

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

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

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

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>・モバイルのページ。"
          ]
        }
      }
    ]
  }
}

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

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