Requêtes et filtres


198

Je ne vois aucune description du moment où je devrais utiliser une requête ou un filtre ou une combinaison des deux. Quelle est la différence entre eux? Quelqu'un peut-il expliquer?


46
La documentation officielle n'est pas très claire en fait
geekazoid

2
On dirait qu'il est apparu une page avec une explication plus avancée: elastic.co/guide/en/elasticsearch/guide/master/…
Dmitry Polushkin

6
Il convient de noter que les requêtes et les filtres seront fusionnés dans ES 2.0, donc la plupart de ce qui a été dit et écrit pour les requêtes par rapport aux filtres ne s'applique plus. Consultez également le blog officiel annonçant ce changement.
Val

Réponses:


201

La différence est simple: les filtres sont mis en cache et n'influencent pas le score, donc plus vite que les requêtes. Jetez un œil ici aussi. Disons qu'une requête est généralement quelque chose que les utilisateurs tapent et à peu près imprévisible, tandis que les filtres aident les utilisateurs à affiner les résultats de la recherche, par exemple en utilisant des facettes.


19
C'est vrai, si l'utilisateur fait une recherche de type Google, j'utiliserais une requête? S'ils sélectionnent une valeur possible dans une liste déroulante (par exemple, nombre de factures> 50), ce serait un filtre?
Jonesie

4
Oui, c'est exactement ça. Chaque fois que vous avez besoin de restreindre l'ensemble complet de documents par une mesure, c'est généralement un cas où un filtre est approprié. Alors peut-être par âge, longueur, taille, etc.
Zach

Ma solution utilise des filtres et des requêtes dans la même requête et elle est super rapide sur la base de données de test. Nous y retrouverons bientôt les données en direct pour voir à quelle vitesse elles sont réellement.
Jonesie

@Zach Pour être absolument clair, dans un système multi-locataire - avec des autorisations pour les utilisateurs d'un locataire -, il semble que les informations sur le locataire / l'authentification soient un filtre ajouté à chaque requête (c'est-à-dire une requête filtrée). Droite?
Scott Willeke

4
@activescott Oui, c'est ce que je ferais. Vous pouvez également configurer des alias filtrés afin que les "alias d'utilisateur" appliquent toujours le filtre approprié. Rend l'administration plus facile et ne nécessite pas de modifications de code pour mettre à jour les requêtes, une corruption supplémentaire dans votre requête, etc.
Zach

99

Voici ce que dit la documentation officielle:

En règle générale, les filtres doivent être utilisés à la place des requêtes:

  • pour les recherches binaires oui / non
  • pour les requêtes sur les valeurs exactes

En règle générale, les requêtes doivent être utilisées à la place des filtres:

  • pour la recherche plein texte
  • où le résultat dépend d'un score de pertinence

quand je veux supprimer un document, dois-je utiliser un filtre si possible? Je ne veux pas qu'il soit mis en cache
Rytek

lors de la suppression d'un document, vous n'avez pas besoin de score, ni de recherche plein texte. Ce serait donc un filtre, car il vous suffit de prendre une décision de suppression / non suppression. filter-query-context
nonNumericalFloat

13

Un exemple (essayez-le vous-même)

L'index de Say myindexcontient trois documents:

curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hello world!" }'
curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hello world! I am Sam." }'
curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hi Stack Overflow!" }'

Requête: dans quelle mesure un document correspond à la requête

Requête hello sam(à l'aide d'un mot clé must)

curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'

Le document "Hello world! I am Sam."reçoit un score plus élevé que "Hello world!", car le premier correspond aux deux mots de la requête. Les documents sont notés.

"hits" : [
   ...
     "_score" : 0.74487394,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...
     "_score" : 0.22108285,
     "_source" : {
       "name" : "Hello world!"
     }
   ...

Filtre: si un document correspond à la requête

Filtre hello sam(à l'aide d'un mot-clé filter)

curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'

Les documents contenant soit helloou samsont retournés. Les documents ne sont PAS notés .

"hits" : [
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world!"
     }
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...

Sauf si vous avez besoin d'une recherche ou d'une notation en texte intégral, les filtres sont préférés car les filtres fréquemment utilisés seront automatiquement mis en cache par Elasticsearch, pour accélérer les performances. Voir Elasticsearch: contexte de requête et de filtre.


11

Peu d'autres ajouts à la même chose. Un filtre est d'abord appliqué, puis la requête est traitée sur ses résultats. Pour stocker la correspondance binaire vrai / faux par document, quelque chose appelé un tableau bitSet est utilisé. Ce tableau BitSet est en mémoire et serait utilisé à partir de la deuxième interrogation du filtre. De cette façon, en utilisant la structure de données du tableau de bits, nous pouvons utiliser le résultat mis en cache.

Encore un point à noter ici, le cache de filtre n'est créé que lorsque la demande est exécutée, donc uniquement à partir du deuxième hit, nous obtenons en fait l'avantage de la mise en cache.

Mais alors vous pouvez utiliser une API plus chaude , pour dépasser cela. Lorsque vous enregistrez une requête avec un filtre par rapport à une API plus chaude, il s'assurera que celle-ci est exécutée sur un nouveau segment chaque fois qu'il est disponible. Par conséquent, nous obtiendrons une vitesse constante dès la première exécution elle-même.


1
Intéressant! Je ne savais pas que les filtres se produisent avant les requêtes. La mise en cache des filtres a désormais plus de sens.
Constant Meiring

Pas toujours. Différence de base et principale entre la requête à score filtré et constant. Le score constant exécute toujours la requête en premier, puis applique un filtre dessus. Même une requête filtrée a des paramètres permettant d'exécuter la requête avant les filtres.
piyushGoyal

10

Fondamentalement, une requête est utilisée lorsque vous souhaitez effectuer une recherche sur vos documents avec notation. Et les filtres sont utilisés pour affiner l'ensemble des résultats obtenus en utilisant la requête. Les filtres sont booléens.

Par exemple, disons que vous avez un index des restaurants quelque chose comme la zomato. Maintenant, vous voulez rechercher des restaurants qui servent de la «pizza» , qui est essentiellement votre mot-clé de recherche.

Vous utiliserez donc la requête pour trouver tous les documents contenant "pizza" et quelques résultats seront obtenus.

Dites maintenant que vous voulez une liste de restaurants qui servent des pizzas et ont une note d'au moins 4,0.

Vous devrez donc utiliser le mot-clé "pizza" dans votre requête et d'appliquer le filtre pour une note de 4,0.

Ce qui se passe, c'est que des filtres sont généralement appliqués aux résultats obtenus en interrogeant votre index.


Vous ne pouvez pas fournir un exemple d'un corps de demande?
Dog

9

Filters-> Ce document correspond-il? une réponse binaire oui ou non

Queries-> Ce document correspond-il? Dans quelle mesure cela correspond-il? utilise la notation


0

Depuis la version 2 d'Elasticsearch, les filtres et les requêtes ont été fusionnés et toute clause de requête peut être utilisée comme filtre ou requête (selon le contexte). Comme pour la version 1, les filtres sont mis en cache et doivent être utilisés si le scoring n'a pas d'importance.

Source: https://logz.io/blog/elasticsearch-queries/

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.