ESのMUST
とSHOULD
boolクエリの違いは何ですか?
私がのみという用語を含む結果が必要な場合は、must
を使用しますか?
特定の値のみを含むクエリがあり、今日の時刻/日付よりも低い日付/タイムスタンプを持つ結果もありません-NOW
また
以下のコードのようなマスト内で複数のフィルターを使用できますか?
"filtered": {
"filter": {
"bool" : {
"must" : {
"term" : { "type" : 1 }
"term" : { "totals" : 14 }
"term" : { "groupId" : 3 }
"range" : {
"expires" : {
"gte": "now"
}
}
},
mustは、一致するドキュメントに句(クエリ)が含まれている必要があることを意味します。論理的なおよびのように、これらの句は一致する必要があります。
shouldは、論理的なまたはのように、これらの句の少なくとも1つが一致する必要があることを意味します。
基本的に、論理演算子ANDおよびORのように使用されます。 this を参照してください。
これで bool query :
must意味:mustが含まれるドキュメントに一致する句。
shouldは、これらの句が一致する場合、_score
を増やします。それ以外の場合、効果はありません。これらは、各ドキュメントの関連性スコアを絞り込むためにのみ使用されます。
はい、must
内で複数のフィルターを使用できます。
これはよくある質問なので、Elasticsearchバージョン2では少し変更が加えられました。
filtered
クエリの代わりに、トップレベルでbool
クエリを使用する必要があります。
must
パーツのスコアを気にしない場合は、それらのパーツをfilter
キーに入れます。スコアリングがないと、検索が高速になります。また、Elasticsearchは、それらをキャッシュするかどうかなどを自動的に判断します。must_not
もキャッシュに有効です。
リファレンス: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
また、ミリ秒単位の粒度のため、"gte": "now"
はキャッシュできないことに注意してください。 must
句で2つの範囲を使用します。1つはnow/1h
を使用し、もう1つはnow
を使用して、1つ目をしばらくキャッシュし、2つ目をより小さな結果セットで正確にフィルタリングするために使用します。
ドキュメント で述べたように:
Must:句(クエリ)は、一致するドキュメントに出現する必要があります。
Should:句(クエリ)が一致するドキュメントに表示されます。 must句のないブールクエリでは、1つ以上のshould句がドキュメントと一致する必要があります。一致するべきshould句の最小数は、minimum_should_matchパラメーターを使用して設定できます。
つまり、結果はallmust句に存在するクエリ(またはmatch 少なくとも1つのmust句がない場合、should句。
結果がすべてのクエリを満たすようにするため、mustを使用する必要があります。
実際、ブールクエリ内でフィルターを使用できます。