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?
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?
Réponses:
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.
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
L'index de Say 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: dans quelle mesure un document correspond à la 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
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 hello
ou sam
sont 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."
}
...
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.
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.
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
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.