Elasticsearch requête Filtrée vs Filtre [dupliquer]

cette question a déjà une réponse ici:

quelle Est la différence entre la requête et le filtre filtré" et "requête et d'un filtre à la racine"? par exemple

Affaire

1:

{
  "query":{
    "filtered":{
      "query":{
        "term":{"title":"kitchen3"}
      },
      "filter":{
        "term":{"price":1000}
      }
    }
  }
}

Cas 2:

{
  "query":{
    "term":{"title":"kitchen3"}
  },
  "filter":{
    "term":{"price":1000}
  }
}

j'ai trouvé cette discussion http://elasticsearch-users.115913.n3.nabble.com/Filtered-query-vs-using-filter-outside-td3960119.html , mais L'URL référencée est 404 et l'explication est un peu trop concise pour moi.

s'il vous Plaît enseigner ou donner un document qui indique la différence entre ces, je vous remercie.

42
demandé sur otiai10 2015-03-10 11:17:41

2 réponses

La différence est liée à la performance. "filter" au niveau supérieur est toujours exécuté après la requête. Cela signifie que la requête est exécutée sur tous les documents, le score est calculé pour tous les documents etc. - et ce n'est qu'alors que les documents ne correspondant pas au filtre sont exclus.

avec la requête "filtrée" il est possible que ES optimise ce calcul, par exemple en exécutant d'abord le filtre, puis en exécutant la requête sur un ensemble limité de documents, en sauvegardant il est temps de tester les documents qui ne correspondent pas au filtre par rapport à la requête, et de calculer les scores pour eux s'ils correspondent à la requête.

si vous effectuez plusieurs requêtes avec le même filtre, il y a encore plus d'avantages: le filtre peut être mis en cache, ce qui améliore encore les performances de chaque requête. Ceci s'applique à votre exemple: les filtres" term " sont mis en cache par défaut.

vous pouvez également contrôler explicitement l'exécution de requête" filtrée" (voir la documentation) pour l'optimiser en fonction de votre cas d'utilisation.

34
répondu Alexey Tigarev 2015-04-25 01:20:16

les filtres dans les deux types peuvent être appelés pré et post filtres aussi. Comme @alexey l'a expliqué, le filtre de niveau de racine est exécuté après la requête et le filtre dans la requête filtrée est exécuté avant la requête.

en outre, vous devez comprendre l'impact de la même autre que l'ordre ils sont exécutés. Le filtre "filtré" requête relève de la requête portée qui signifie que lors du calcul des agrégations le filtre de sortie sera pris en compte en cas des agrégations de filtre de niveau root seront effectuées seulement sur les résultats de la requête excluant le filtre. Bien que dans les deux cas les documents de résultat seront les mêmes.

par exemple, avec les deux requêtes que vous avez postées, les deux donneront les mêmes résultats, mais si vous effectuez des agrégations aussi la première requête calculera le nombre d'agrégation à partir de documents correspondant au titre kitchen3 et au prix 10000 tandis que la seconde requête calculera le nombre d'agrégation à partir de documents titre de la cuisine d'assortiment 3 seulement sans filtre du prix 1000.

8
répondu Prabin Meitei 2015-04-25 03:12:59