2017-01-25 5 views
0

existiert ich ES 2.3 verwenden und eine Abfrage hat, in der filter Abschnitt sieht wie folgt aus:Elasticsearch: ein Filter auf verschachteltes Dokument ausführt nur, wenn es

"filter": { 
    "query": { 
     "bool": { 
     "must": [ 
      { 
      "nested": { 
       "path": "employees", 
       "query": { 
       "bool": { 
        "must": [ 
        { 
         "range": { 
         "employees.max_age": { 
          "lte": 50 
         } 
         } 
        }, 
        { 
         "range": { 
         "employees.min_age": { 
          "gte": 20 
         } 
         } 
        } 
        ] 
       } 
       } 
      } 
      }, 
      { 
      "exists": { 
       "field": "employees" 
      } 
      }, 
      { 
      #....other filter here based on root document, not on nested employee document 
      } 
     ] 
     } 
    } 
    } 
} 

Ich habe einen Filter, wo ich einige Bedingungen Check-in das verschachtelte Dokument "Mitarbeiter" in einem größeren Dokument namens Firma, aber ich möchte diesen Filter nur ausführen, wenn das Objekt "Mitarbeiter" existiert, da einige Dokumente dieses verschachtelte Dokument überhaupt nicht haben. Also fügte ich hinzu: {"exists": {"field": "employees"}} aber das scheint nicht zu funktionieren. Irgendeine Idee, welche Änderung ich machen sollte, damit es funktioniert?

+0

Sie benötigen die 'exists' Abfrage innerhalb der' nested' Abfrage zu bewegen und es wird funktionieren – Val

+0

@val können Sie mir bitte zeigen, wo sollte ich es genau setzen? – JVK

+0

Auch wenn Sie es in "geschachtelt" setzen, dann nehmen Sie bereits an, dass verschachtelt bereits existiert, dann wird es nur durchlaufen? – JVK

Antwort

0

Sie können es so machen. Wenn Dokumente jedoch nicht das Feld employees haben, werden sie sowieso nicht abgeholt, also bin ich mir nicht sicher, warum Sie diese exists Abfrage an erster Stelle benötigen/brauchen.

{ 
    "filter": { 
    "query": { 
     "bool": { 
     "must": [ 
      { 
      "nested": { 
       "path": "employees", 
       "query": { 
       "exists": { 
        "field": "employees" 
       } 
       } 
      } 
      }, 
      { 
      "nested": { 
       "path": "employees", 
       "query": { 
       "bool": { 
        "must": [ 
        { 
         "range": { 
         "employees.max_age": { 
          "lte": 50 
         } 
         } 
        }, 
        { 
         "range": { 
         "employees.min_age": { 
          "gte": 20 
         } 
         } 
        } 
        ] 
       } 
       } 
      } 
      } 
     ] 
     } 
    } 
    } 
} 
+0

Danke @val Ich werde das versuchen und werde Sie wissen lassen. In Bezug auf "Wenn Dokumente jedoch nicht über das Feld" Mitarbeiter "verfügen, werden sie sowieso nicht abgeholt. Daher bin ich mir nicht sicher, warum Sie diese Abfrage überhaupt benötigen/brauchen." - Weil ich diese Dokumente einschließen will, sogar wo "Angestellte" nicht existiert. Was ich wollte ist, wenn und nur wenn 'Mitarbeiter' existieren, dann führe nur den Filter aus. – JVK

+0

In diesem Fall hängt es davon ab, wie Ihre gesamte Abfrage aussieht, wir werden sehen. – Val

Verwandte Themen