ElasticSearchは、3つのクエリの結合を達成しようとしているときに、クエリに一致する「最も関連性の高い」ドキュメントを探しています。
これを行う最も簡単な(そして最速の)方法は、マルチ検索を使用して3つのクエリを実行することです。
curl -XGET 'http://127.0.0.1:9200/my_index/_msearch?pretty=1' -d '
{}
{"query" : {"text" : {"title" : "some words"}}, "size" : 5}
{}
{"query" : {"text" : {"title" : "some other words"}}, "size" : 5}
{}
{"query" : {"text" : {"title" : "other words"}}, "size" : 5}
'
要件によっては、制限フィルターを使用することもできますが、インデックスごとではなく、シャードごとの結果の数が制限されることに注意してください。デフォルトでは、インデックスには5つのプライマリシャードがあるため、5の制限を指定すると、25の結果が返される可能性があります。
したがって、おそらく次のようなものです。
curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1' -d '
{
"query" : {
"bool" : {
"should" : [
{
"filtered" : {
"filter" : {
"limit" : {
"value" : 1
}
},
"query" : {
"text" : {
"title" : "some words"
}
}
}
},
{
"filtered" : {
"filter" : {
"limit" : {
"value" : 1
}
},
"query" : {
"text" : {
"title" : "other words"
}
}
}
},
{
"filtered" : {
"filter" : {
"limit" : {
"value" : 1
}
},
"query" : {
"text" : {
"title" : "some other words"
}
}
}
}
]
}
}
}
'
これにより、各シャードの各フレーズの最高スコアのドキュメントが得られます(5つのシャードで最大15のドキュメント、(指定していないためsize=15
)トップ10のドキュメントに削減されます)。
マイレージは、ドキュメントがシャード全体にどのように分散されているかによって異なる場合があります。