web-dev-qa-db-fra.com

Requêtes ou filtres

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

186
Jonesie

La différence est simple: les filtres sont mis en cache et n’influencent pas le score, donc plus rapides que les requêtes. Regardez ici aussi. Supposons qu'une requête soit en général quelque chose que les utilisateurs saisissent et à peu près imprévisible, tandis que les filtres aident les utilisateurs à préciser les résultats de la recherche, par exemple à l'aide de facettes.

187
javanna

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 des recherches binaires oui/non
  • pour des 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 en texte intégral
  • où le résultat dépend d'un score de pertinence
92
igo

Un exemple (essayez vous-même)

Say index myindex contient 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: à quel point un document correspond à la requête

Requete hello sam (avec le mot-clé must)

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

Document "Hello world! I am Sam." obtient un score supérieur à "Hello world!", car l'ancien correspond aux deux mots de la requête. Les documents sont évalué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

Filtrer hello sam (avec le mot-clé filter)

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

Les documents contenant hello ou sam sont renvoyé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."
     }
   ...

Les filtres sont préférables, sauf si vous avez besoin d'une recherche en texte intégral ou d'une évaluation, car les filtres fréquemment utilisés seront automatiquement mis en cache par Elasticsearch, ce qui accélérera les performances. Voir Elasticsearch: Contexte de requête et de filtrage.

12
sam

Peu plus d'addition à la même chose. Un filtre est appliqué en premier, puis la requête est traitée sur ses résultats. Pour stocker la correspondance vrai/faux binaire par document, un tableau appelé bitSet Array est utilisé. Ce tableau BitSet est en mémoire et sera utilisé à partir de la seconde 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.

Un point supplémentaire à noter ici, le cache de filtre n’est créé que lorsque la demande est exécutée, et donc uniquement à partir du deuxième hit, nous obtenons l’avantage de la mise en cache.

Mais alors vous pouvez utiliser API plus chaude , pour dépasser cela. Lorsque vous enregistrez une requête avec le filtre sur une API plus chaude, elle s'assure que celle-ci est exécutée sur un nouveau segment à chaque fois qu'il est activé. Nous aurons donc une vitesse constante dès la première exécution.

11
Vineeth Mohan

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 à l'aide d'une requête. Les filtres sont booléens.

Par exemple, disons que vous avez un index de restaurants qui ressemble à zomato. Maintenant, vous voulez rechercher des restaurants qui servent "pizza", qui est fondamentalement votre mot-clé de recherche.

Donc, vous allez utiliser la requête pour trouver tous les documents contenant "pizza" et obtenir quelques résultats.

Supposons maintenant que vous souhaitiez une liste de restaurants servant des pizzas et ayant une cote atleast 4.0.

Il vous faudra donc utiliser le mot clé "pizza" dans votre requête et appliquer le filtre pour obtenir la note 4.0.

En réalité, les filtres sont généralement appliqués aux résultats obtenus en interrogeant votre index.

10
Rahul Bhanushali

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

Queries -> Ce document correspond-il? Est-ce que ça correspond? utilise notation

7
eosimosu