UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Elasticsearch】Multi-match queryのtype

以前、ElasticsearchのMulti-match queryを使ってみた

uga-box.hatenablog.com

これの用途として、例えば"東京"のつもりで「to」と入力された時に、完全一致が一番スコアが高く、前方一致するものがアナライザーに即して順次ぶら下げたいというときに

このようにkeywordに対してブーストをかけて検索していた

      "query": "to", 
      "fields": [ 
          "city.keyword^2",
          "text.keyword^2",
          "city",
          "text"
        ],
       "type": "best_fields",

しかし、次に"東京 新宿"のつもりで「tokyo shinju」と入力された時に、「tokyo」は完全一致のみだが、「shinju」は先ほどと同じように完全一致が一番スコアが高く、前方一致するものが次にくるようにするクエリをどうするかを考えたときに

ちょっと複雑になりそうで考え直した

ここで、Multi-match queryのtypeをデフォルトのbest_fieldsにしていたのだが、他の使い方について調べてみた

www.elastic.co

type 概要
best_fields (デフォルト)任意のフィールドに一致するドキュメントを検索し、_scoreが最も高いものを使用する
most_fields 任意のフィールドに一致するドキュメントを検索し、各フィールドの_scoreを組み合わせる
cross_fields フィールドを1つの大きなフィールドであるかのように、同じアナライザーで処理する。任意のフィールドで各単語を検索する。
phrase 各フィールドでmatch_phraseクエリを実行し、_scoreが最も高いものを使用する
phrase_prefix 各フィールドでmatch_phrase_prefixクエリを実行し、_scoreが最も高いものを使用する
bool_prefix 各フィールドにmatch_bool_prefixクエリを作成し、各フィールドの_scoreを結合する

最後のmatch_bool_prefixクエリが気になって調べたらドンピシャで求めているものだった

match_bool_prefixクエリ

Match boolean prefix query | Elasticsearch Guide [7.x] | Elastic

以下のようなクエリを書くと

GET /_search
{
  "query": {
    "match_bool_prefix" : {
      "message" : "quick brown f"
    }
  }
}

次のクエリと同等のことをおこなってくれる

GET /_search
{
  "query": {
    "bool" : {
      "should": [
        { "term": { "message": "quick" }},
        { "term": { "message": "brown" }},
        { "prefix": { "message": "f"}}
      ]
    }
  }
}

なので、クエリはbool_prefixを使って以下とするのがよさそう

      "query": "tokyo shinju", 
      "fields": [ 
          "city",
          "text",
        ],
       "type": "bool_prefix",

ということがわかった

他参考

https://christina04.hatenablog.com/entry/elasticsearch-multi-match-query