以前、ElasticsearchのMulti-match queryを使ってみた
これの用途として、例えば"東京"のつもりで「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
にしていたのだが、他の使い方について調べてみた
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