2015-03-05 6 views
8

Angenommen, ich habe einen Index mit verschachteltem Dokument, das wie folgt aussieht:Wie kann ich gefilterte verschachtelte Dokumente in ElasticSearch aggregieren?

{ 
    "id" : 1234 
    "cars" : [{ 
      "id" : 987 
      "name" : "Volkswagen" 
     }, { 
      "id": 988 
      "name" : "Tesla" 
     } 
    ] 
} 

Ich mag jetzt eine Zählung Aggregation von „Auto“ Dokumenten erhalten, die ein bestimmtes Kriterium entspricht, z.B. die einer Suchanfrage entsprechen. Mein erster Versuch war die folgende Abfrage:

{ 
    "query" : { 
    "nested" : { 
     "path" : "cars", 
     "query" : { 
     "query_string" : { 
      "fields" : ["cars.name"], 
      "query" : "Tes*" 
     } 
     } 
    } 
    }, 
    "aggregations" : { 
    "cars" :{ 
     "nested" : { 
     "path" : "cars" 
     }, 
     "aggs" : { 
     "cars" : { 
      "terms" : { 
      "field" : "cars.id" 
      } 
     } 
     } 
    } 
    } 
} 

Ich war hier die Hoffnung, eine Aggregation Ergebnis zu erhalten, wobei nur die IDs von Autos, deren Namen beginnen mit „Tes“. Die Aggregation verwendet jedoch stattdessen alle Autos, die sich in einem Top-Level-Dokument befinden, das auch passende verschachtelte Dokumente enthält. Das heißt, in dem obigen Beispiel würde "Volkswagen" auch gezählt werden, weil das Dokument der obersten Ebene auch ein Auto enthält, das übereinstimmt.

Wie kann ich nur die passenden verschachtelten Dokumente zusammenfassen?

Antwort

9

In der Zwischenzeit ich es gedacht habe aus: dies eine Filter Aggregation zu erreichen, sollte wie so um die die Begriffe Aggregation hinzugefügt werden:

"aggregations" : { 
    "cars" :{ 
     "nested" : { 
     "path" : "cars" 
     }, 
     "aggs" : { 
     "cars-filter" : { 
      "filter" : { 
      "query" : { 
       "query_string" : { 
       "fields" : ["cars.name"], 
       "query" : "Tes*" 
       } 
      } 
      }, 
      "aggs" : { 
      "cars" : { 
       "terms" : { 
       "field" : "cars.id" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
+0

Sind Sie sicher, dass dieser Code funktioniert? Ich habe das gleiche Problem, aber wenn ich Ihren Code versuche, bekomme ich eine 'parsing_exception'" no [query] registriert für [query] " –

+0

Es hat definitiv funktioniert, als ich diese Abfrage erstellt habe, aber das Abfrageformat von ES hasn ' t immer rückwärtskompatibel. IIRC Ich habe diese Abfrage für ES1.x geschrieben, neuere Versionen akzeptieren dies möglicherweise nicht. – Tiddo

+0

Ja, @Tiddo - Ich bekomme die gleiche Antwort wie du. Kann nicht sehen, wie dies für die aktuelle Version zu tun ist. Lassen Sie es mich wissen, wenn Sie damit fertig werden. – danieljames

Verwandte Themen