web-dev-qa-db-ja.com

MUSTとSHOULDのboolクエリのElasticsearchの違い

ESのMUSTSHOULD boolクエリの違いは何ですか?

私がのみという用語を含む結果が必要な場合は、mustを使用しますか?

特定の値のみを含むクエリがあり、今日の時刻/日付よりも低い日付/タイムスタンプを持つ結果もありません-NOW

また

以下のコードのようなマスト内で複数のフィルターを使用できますか?

"filtered": {
"filter": {
"bool" : {
        "must" : {
            "term" : { "type" : 1 }
            "term" : { "totals" : 14 }
            "term" : { "groupId" : 3 }
            "range" : {
                "expires" : {
                    "gte": "now"
                }
            }
        },
111
user2722667

mustは、一致するドキュメントに句(クエリ)が含まれている必要があることを意味します。論理的なおよびのように、これらの句は一致する必要があります。

shouldは、論理的なまたはのように、これらの句の少なくとも1つが一致する必要があることを意味します。

基本的に、論理演算子ANDおよびORのように使用されます。 this を参照してください。

これで bool query

must意味:mustが含まれるドキュメントに一致する句。

shouldは、これらの句が一致する場合、_scoreを増やします。それ以外の場合、効果はありません。これらは、各ドキュメントの関連性スコアを絞り込むためにのみ使用されます。


はい、must内で複数のフィルターを使用できます。

162
Utsav Dawn

これはよくある質問なので、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つ目をより小さな結果セットで正確にフィルタリングするために使用します。

12

ドキュメント で述べたように:

Must:句(クエリ)は、一致するドキュメントに出現する必要があります。

Should:句(クエリ)が一致するドキュメントに表示されます。 must句のないブールクエリでは、1つ以上のshould句がドキュメントと一致する必要があります。一致するべきshould句の最小数は、minimum_should_matchパラメーターを使用して設定できます。

つまり、結果はallmust句に存在するクエリ(またはmatch 少なくとも1つmust句がない場合、should句。

結果がすべてのクエリを満たすようにするため、mustを使用する必要があります。


実際、ブールクエリ内でフィルターを使用できます。

3
Heschoon