2015-04-27 6 views
2

Selon ElasticSearch doc à http://www.elastic.co/guide/en/elasticsearch/guide/master/combining-filters.html, un filtre bool peut être la suivante:compréhension du filtre bool

{ 
    "bool" : { 
     "must" :  [ 
      A, 
      B 
     ], 
     "should" : [ 
      C, 
      D 
     ], 
     "must_not" : [ 
      E, 
      F 
     ], 
    } 
} 

Dans un sens, il est équivalent aux opérations logiques suivantes:

A and B and (C or D) and (not E) and (not F) 

Est-ce correct?

Merci!

+3

Cela serait correct, oui. –

+0

Andrei, si vous faites votre réponse une réponse, je vais le sélectionner. La raison pour laquelle je pose cette question est que "must_not" peut être déroutant. Ce n'est pas "pas (E et F)" Merci! Pickypg – curious1

Répondre

5

Comme Andrei a souligné dans les commentaires, c'est la compréhension correcte pour un boolfiltre:

  • must peut être traduit par (A and B)
  • should peut être traduit comme (C or D)
  • must_not peut être traduit par ((not E) and (not F))

Chacune d'elles est une opération autonome, mais elle peut être combinée exactement comme vous l'avez montré.

(A and B) and (C or D) and ((not E) and (not F)) 

En termes de logique booléenne, la raison pour laquelle ce n'est pas la même chose que (not (E and F)) est parce que c'est la même chose que dire ((not E) or (not F)). Si E est le même que dire field == 5 et F est le même que dire field == 6, alors c'est la même chose que field != 5 or field != 6, ce qui est toujours le cas!

Cela conduit à regarder d'une manière différente:

  • must_not peut être traduit par (not (E or F))

En d'autres termes, le document ne correspond pas si aucun filtre ne correspond pas. Cela conduit à une version légèrement simplifiée de la version combinée:

(A and B) and (C or D) and (not (E or F)) 
+0

, merci pour l'explication limpide et élargie! Cordialement. – curious1

+0

Beaucoup mieux que mon simple "oui" haha. –

+0

Andrei, le tien est génial aussi !!! Merci de votre aide. Cordialement. – curious1