Multi Matchクエリでのフレーズ検索について(2-gram、同義語検索)


#1

お世話になっております。
Multi Matchクエリで2-gramの同義語検索、かつフレーズ検索をしたいのですが、
同義語展開後、フレーズ検索をすることができません。
どなたか解決策をご存じでしょうか。

1.アナライザー設定

{
  "analysis": {
    "filter": {
      "synonym": {
        "type": "synonym",
        "synonyms_path": "Analyzer\\synonym.txt"
      },
      "bigram_filter": {
        "type": "ngram",
        "min_gram": "2",
        "max_gram": "2"
      },
      "pos_filter": {
        "type": "kuromoji_part_of_speech",
        "stoptags": [ "記号", "記号-一般", "記号-読点", "記号-句点", "記号-空白", "記号-括弧開", "記号-括弧閉" ]
      },
      "normalize": {
        "name": "nfkc",
        "type": "icu_normalizer"
      }
    },
    "char_filter": {
      "whitespace_remove": {
        "pattern": "\\s{1,}",
        "type": "pattern_replace",
        "replacement": ""
      },
      "map": {
        "type": "mapping",
        "mappings_path": "Analyzer\\mapping.txt"
      },
      "zenkakuspace_remove": {
        "pattern": " ",
        "type": "pattern_replace",
        "replacement": ""
      },
      "normalize": {
        "mode": "compose",
        "name": "nfkc",
        "type": "icu_normalizer"
      }
    },
    "analyzer": {
      "jp_search_bigram": {
        "filter": [ "pos_filter", "synonym", "normalize", "bigram_filter" ],
        "char_filter": [ "map", "normalize", "whitespace_remove", "zenkakuspace_remove" ],
        "type": "custom",
        "tokenizer": "whitespace_tokenizer"
      },
      "jp_bigram": {
        "filter": [ "pos_filter", "normalize" ],
        "char_filter": [ "map", "normalize", "whitespace_remove", "zenkakuspace_remove" ],
        "type": "custom",
        "tokenizer": "jp_bigram_tokenizer"
      }
    },
    "tokenizer": {
      "jp_bigram_tokenizer": {
        "type": "ngram",
        "min_gram": "2",
        "max_gram": "2"
      },
      "whitespace_tokenizer": { "type": "whitespace" }
    }
  }

2.検索クエリ

GET index1/_search
{
  "from": 0,
  "size": 100,
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "type": "phrase",
            "query": "建て替え",
            "analyzer": "jp_search_bigram",
            "fields": [
              "Field1",
              "Field2"
            ]
          }
        }
      ]
    }
  }
}

フィルターでなく、トークナイザーで2-gramにすればフレーズ検索できるのですが、
その場合、同義語展開ができないため質問させていただきました。
よろしくお願いいたします。


(Jun Ohtani) #2

synonym filterの設定でsynonymを読み込む時点で、デフォルトだとwhitespaceのtokenizerが指定されるので、n-gramと異なるトークナイズになってしまうので、synonymが展開されていないのだと思います。
tokenizerというパラメータがあるので、そこにjp_bigram_tokenizerを指定するのが良いかと。

あと、関係ないですが、jp_bigrampos_filterは必要ないので削除するのが良いかと。pos_filterkuromoji_tokenizerが出力した情報を使用するためです。


#3

ご回答ありがとうございます。
synonym filterにtokenizerパラメータがあることを見逃しておりました。
ご指摘いただいた通りに修正し、正しくsynonymが展開されることを確認いたしました。
また、pos_filterも削除いたします。ありがとうございました。


(system) #4

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