Elasticsearch différence entre le DOIT et DEVRAIT bool requête
Quelle est la différence entre MUST
et SHOULD
bool requête en ES?
Si je SEULEMENT veulent des résultats qui contiennent mes conditions dois-je alors utiliser must
?
J'ai une requête qui ne doit contenir certaines valeurs, et aussi pas de résultats, qui a une faible horodatage qu'aujourd'hui l'heure/date - MAINTENANT
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"
}
}
},
Vous devez vous connecter pour publier un commentaire.
doit signifie: La clause (requête) doit apparaître dans les documents correspondants. Ces clauses doivent correspondre, comme la logique ET.
devrait signifie: Au moins l'une de ces clauses doivent correspondre, comme la logique OU.
Ils sont essentiellement utilisés comme opérateurs logiques et ET OU. Voir cette.
Maintenant dans un bool requête:
doit signifie: les Clauses qui doit match pour que le document soit inclus.
devrait signifie: Si ces clauses match, ils augmentent la
_score
; sinon, ils n'ont aucun effet. Ils sont simplement utilisés pour affiner la pertinence des points pour chaque document.Oui, vous pouvez utiliser plusieurs filtres à l'intérieur de
must
.must
pour les catégories, ou de la tarification, etshould
pour les attributs, tels que la taille et la couleur. Maintenant, si la taille L et XL sont sélectionnés, il faut entre les deux, mais si la couleur verte est également sélectionné, il doit être un must have pour (taille L OU XL) ET (de couleur verte). Est-ce possible?minimum_number_should_match = 1
afin de faire valoir l'idée que "au moins une de ces clauses doivent correspondre".must
etfilter
, et j'ai trouvé ceci: "filter
Clausesmust
match, mais sont exécuter en non-marquant, le mode de filtrage. Ces clauses ne contribuent pas à la partition, au lieu de cela, ils n'ont qu'à inclure/exclure les documents en fonction de leurs critères." Nouvelle documentation: élastique.co/guide/fr/elasticsearch/guide/actuel/...bool
requête avec unshould
à l'intérieur unmust
(requête: { bool: { doit: { query: [], devrait: [] } } }), ce qui suppose un sens différent, puisque dans ce scénario, leshould
peut influencer dans le nombre total de documents de correspondance, correct?Puisque c'est une question populaire, je voudrais ajouter que dans Elasticsearch la version 2, les choses ont un peu changé.
Au lieu de
filtered
requête, il faut utiliser lebool
requête dans le haut niveau.Si vous n'avez pas de soins sur le score de
must
parties, puis mettre ces pièces enfilter
clé. Pas de notation des moyens de recherche plus rapide. Aussi, Elasticsearch automatiquement la figure, que ce soit pour 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
Aussi, l'esprit que
"gte": "now"
ne peut pas être mis en cache, en raison de la granularité de l'ordre de la milliseconde. L'utilisation des deux plages dans unmust
clause: l'un avecnow/1h
et un autre avecnow
de sorte que le premier peut être mis en cache pendant un certain temps et la deuxième pour un filtrage précis accéléré sur un petit jeu de résultats.Comme on dit dans le la documentation:
En d'autres termes, les résultats devront être compensée par tous les requêtes présentes dans la doit clause ( ou le match au moins un de la devrait clauses si il n'y a pas de doit clause.
Puisque vous voulez que vos résultats de satisfaire toutes les requêtes, vous devez utiliser doit.
En effet, vous pouvez utiliser des filtres à l'intérieur d'une requête booléenne.