Quelle est la différence entre MUST
et SHOULD
requête booléenne dans ES?
Si je SEULEMENT veux des résultats contenant mes termes, dois-je alors utiliser must
?
J'ai une requête qui ne doit contenir que certaines valeurs et aucun résultat dont la date/l'horodatage est inférieur à celui d'aujourd'hui (date/heure) - NOW
aussi
Puis-je utiliser plusieurs filtres à l'intérieur d'un must comme le code ci-dessous:
"filtered": {
"filter": {
"bool" : {
"must" : {
"term" : { "type" : 1 }
"term" : { "totals" : 14 }
"term" : { "groupId" : 3 }
"range" : {
"expires" : {
"gte": "now"
}
}
},
must signifie: la clause (requête) doit apparaître dans les documents correspondants. Ces clauses doivent correspondre, comme logiques ET.
devrait signifie: au moins une de ces clauses doit correspondre, par exemple logique OU.
Fondamentalement, ils sont utilisés comme opérateurs logiques AND et OR. Voir this .
Maintenant dans un requête booléenne :
must signifie: Les clauses qui doivent correspondre pour que le document soit inclus.
devrait signifie: Si ces clauses correspondent, elles augmentent le _score
; sinon, ils n'ont aucun effet. Ils sont simplement utilisés pour affiner le score de pertinence de chaque document.
Oui, vous pouvez utiliser plusieurs filtres dans must
.
Comme il s’agit d’une question populaire, j’aimerais ajouter que dans Elasticsearch version 2, les choses ont un peu changé.
Au lieu de la requête filtered
, on devrait utiliser la requête bool
au niveau supérieur.
Si vous ne vous souciez pas de la partition de must
parties, placez ces parties dans la touche filter
. Aucune notation ne signifie une recherche plus rapide. De plus, Elasticsearch déterminera automatiquement s'il faut les mettre en cache, etc. must_not
est également valable pour la mise en cache.
Référence: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
De plus, gardez à l'esprit que "gte": "now"
ne peut pas être mis en cache, à cause de la granularité de la milliseconde. Utilisez deux plages dans une clause must
: une avec now/1h
et une autre avec now
de sorte que la première puisse être mise en cache pendant un moment et la seconde pour un filtrage précis accéléré sur un ensemble de résultats plus petit.
Comme indiqué dans la documentation :
Doit: la clause (requête) doit apparaître dans les documents correspondants.
Devrait: La clause (requête) devrait 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 minimal de clauses should à faire correspondre peut être défini à l'aide du paramètre minimum_should_match.
En d'autres termes, les résultats devront être appariés par toutes les requêtes présentes dans la clause doivent ( ou correspondre à au moins une des clauses devrait s'il n'y a pas de must clause.
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.