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


168

ESのboolクエリMUSTとの違いは何SHOULDですか?

自分の用語を含む結果のみが必要な場合は、使用する必要がありますmustか?

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

また

以下のコードのように、must内で複数のフィルターを使用できますか?

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

回答:


249

必須:句(クエリ)は、一致するドキュメントに出現する必要があります。これらの句は、論理ANDなどのように一致する必要があります。

意味:論理ORなど、これらの句の少なくとも1つが一致する必要があります。

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

今、ブールクエリで

mustは、ドキュメントを含めるために一致する必要のある条項を意味します。

必要があります手段は:これらの句が一致した場合、彼らが増加します_score。それ以外の場合、効果はありません。これらは単に各ドキュメントの関連性スコアを調整するために使用されます。


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


パーティーには少し遅れmustますが、カテゴリや価格、shouldサイズや色などの属性についてはどうですか。これで、サイズLとXLが選択されている場合は、これらの2つの間にあるはずですが、緑も選択されている場合は、(サイズLまたはXL)AND(緑の色)の必需品でなければなりません。それは可能ですか?
2015

私はその場合、フィルターは属性のためのより良いアプローチかもしれないと信じています。それらは、完全一致に向けられており、関連性に基づく検索ではありません。詳細については、ドキュメントのクエリとフィルタをご覧ください。
ジムK.15年

6
minimum_number_should_match = 1「これらの節の少なくとも1つが一致しなければならない」という考えを強制するためには、あなたが持っている必要があると思います。
ジムK.15年

いい答えだ!これを理解するのに非常に役立つドキュメントの一部を共有したいと思います。elastic.co/guide/en/elasticsearch/guide/current/...
ba0708

1
JimK-またはno must節。must句がない場合、minimum_number_should_matchが暗黙指定されます。
LizH 2017年

15

これは人気のある質問なので、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つはwithともう1つはwith now/1hnow使用して、最初のキャッシュはしばらくの間キャッシュでき、2つ目はより小さな結果セットで加速される正確なフィルタリングのためです。


8

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

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

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

言い換えると、結果は、must句にあるすべてのクエリと一致する必要がありますmust句がない場合は、少なくとも1つshould句と一致する必要があります。

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


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


10
「マストを使うべき」ではなく「マストを使わなければならない」という意味だと思います;-)
jarmod
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.