Différence Elasticsearch entre la requête booléenne DOIT et DEVRAIT

169

Quelle est la différence entre MUSTet une SHOULDrequête booléenne dans ES?

Si je veux UNIQUEMENT des résultats contenant mes conditions, dois-je les utiliser must?

J'ai une requête qui ne devrait contenir que certaines valeurs, et également aucun résultat qui a une date / horodatage inférieure à l'heure / date d'aujourd'hui - MAINTENANT

Aussi

Puis-je utiliser plusieurs filtres dans un must comme le code ci-dessous:

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

Réponses:

252

must signifie: La clause (requête) doit apparaître dans les documents correspondants. Ces clauses doivent correspondre, comme ET logique .

should signifie: Au moins une de ces clauses doit correspondre, comme OU logique .

Fondamentalement, ils sont utilisés comme des opérateurs logiques ET et OU. Regarde ça .

Maintenant dans une requête booléenne :

must signifie: Clauses qui doivent correspondre pour que le document soit inclus.

should signifie: Si ces clauses correspondent, elles augmentent le _score; sinon, ils n'ont aucun effet. Ils servent simplement à affiner le score de pertinence de chaque document.


Oui, vous pouvez utiliser plusieurs filtres à l'intérieur must.

Utsav Dawn
la source
Un peu tard pour la fête, mais que diriez-vous mustdes catégories, des prix et shoulddes attributs, comme la taille et la couleur. Maintenant, si la taille L et XL est sélectionnée, c'est un must entre ces deux, mais si la couleur verte est également sélectionnée, elle doit être un must pour (tailles L OU XL) ET (couleur verte). Est-ce possible?
Mave
Je crois que dans ce cas, les filtres pourraient être une meilleure approche pour les attributs. Ils sont axés sur des correspondances exactes et non sur des recherches basées sur la pertinence. Pour plus d'informations, consultez les requêtes et les filtres dans la documentation.
Jim K.
6
Je pense que vous devez avoir minimum_number_should_match = 1pour appliquer l'idée qu '"au moins une de ces clauses doit correspondre".
Jim K.
Bonne réponse! Je veux juste partager une partie de la documentation qui m'a été très utile pour comprendre cela. élastique.co
ba0708
1
JimK - ou pas de clause obligatoire. Lorsqu'il n'y a pas de clause must, le minimum_number_should_match est implicite.
LizH
15

Comme il s'agit d'une question populaire, je voudrais ajouter que dans Elasticsearch version 2, les choses ont un peu changé.

Au lieu de la filteredrequête, il faut utiliser la boolrequête au niveau supérieur.

Si vous ne vous souciez pas du score des mustparties, mettez ces parties en filterclé. Aucun score signifie une recherche plus rapide. En outre, Elasticsearch déterminera automatiquement si les mettre en cache, etc. must_notest également valable pour la mise en cache.

Référence: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

Notez également que "gte": "now"cela ne peut pas être mis en cache, en raison de la granularité milliseconde. Utilisez deux plages dans une mustclause: une avec now/1het une autre avec nowafin que la première puisse être mise en cache pendant un certain temps et la seconde pour un filtrage précis accéléré sur un ensemble de résultats plus petit.

TautrimasPajarskas
la source
8

Comme indiqué dans la documentation :

Doit: la clause (requête) doit apparaître dans les documents correspondants.

Devrait: La clause (requête) doit apparaître dans le document correspondant. Dans une requête booléenne sans clause must, une ou plusieurs clauses should doivent correspondre à un document. Le nombre minimum de clauses should à correspondre peut être défini à l'aide du paramètre minimum_should_match.

En d'autres termes, les résultats devront correspondre à toutes les requêtes présentes dans la clause must (ou correspondre à au moins une des clauses should s'il n'y a pas de clause must .

Puisque vous voulez que vos résultats satisfassent à toutes les requêtes, vous devez utiliser must .


Vous pouvez en effet utiliser des filtres dans une requête booléenne.

Heschoon
la source
10
Je pense que vous voulez dire "vous devez utiliser must" plutôt que "vous devriez utiliser must" ;-)
jarmod