2017-09-09 12 views
1

Ich sehe ein paar Posts um verschachtelte Felder und Aggregation, aber keine von ihnen scheint meine Frage zu beantworten. Also, verzeihen Sie mir, wenn dies eine wiederholte Frage ist und jede Hilfe sehr geschätzt würde.ElasticSearch: Verschachtelte Felder und Aggregation

Wir haben einen Index von Vorlesungen gebaut und Vorträge haben folgende Eigenschaften:

  • Ein Vortrag kann entweder in Person werden (live) oder pre-recorded (online)
  • Jede Vorlesung kann mehrere Kapitel haben
  • Jedes dieser Kapitel kann von verschiedenen Dozenten abgedeckt werden (Beispiel: Kapitel 1 der Quantenphysik kann durch fünf verschiedene Dozenten abgedeckt werden, und drei von ihnen kann unter Spannung stehen und die anderen beiden können online sein)
  • Eine Online-Vorlesung hat immer einen Eintrag pro pro Qualität Dozent pro Kapitel

Etwa die Struktur ist wie folgt:

{ 
    "topics": [ 
    { 
     "id": "TOP1", 
     "chapters": [ 
     { 
      "chapterId": 12345, 
      "availability": [ 
      { 
       "type": "LIVE", 
       "lecturer": "Dr. Abraham Fisher", 
       "lectureChapterId": "861731", 
       "availableFrom": "2017-09-11 13:00:00", 
       "expiresAt": "2017-09-11 15:00:00", 
       "lecturerIds": [ 
       "MON121", 
       "MEL122" 
       ] 
      }, 
      { 
       "type": "LIVE", 
       "lecturer": "Dr. Bob Fisher", 
       "lectureChapterId": "181751", 
       "availableFrom": "2017-09-11 20:00:00", 
       "expiresAt": "2017-09-11 22:00:00", 
       "lecturerIds": [ 
       "MON122", 
       "MEL123" 
       ] 
      }, 
      { 
       "type": "LIVE", 
       "lecturer": "Dr. Bob Fisher", 
       "lectureChapterId": "181751", 
       "availableFrom": "2017-09-17 20:00:00", 
       "expiresAt": "2017-09-17 22:00:00", 
       "lecturerIds": [ 
       "MON122", 
       "MEL123" 
       ] 
      }, 
      { 
       "type": "LIVE", 
       "lecturer": "Dr. Abraham Fisher", 
       "lectureChapterId": "861731", 
       "availableFrom": "2017-09-17 13:00:00", 
       "expiresAt": "2017-09-17 15:00:00", 
       "lecturerIds": [ 
       "MON121", 
       "MEL122" 
       ] 
      }, 
      { 
       "type": "ONLINE", 
       "quality" : "HD", 
       "price" : 19.99, 
       "lecturer": "Dr. Catherine Fisher", 
       "lectureChapterId": "9127312", 
       "availableFrom": "2017-01-17 00:00:00", 
       "expiresAt": "2017-12-31 23:59:59", 
       "lecturerIds": [ 
       "MON120", 
       "MEL120" 
       ] 
      }, 
      { 
       "type": "ONLINE", 
       "quality" : "SD", 
       "price" : 10.99, 
       "lecturer": "Dr. Catherine Fisher", 
       "lectureChapterId": "9127312", 
       "availableFrom": "2017-01-17 00:00:00", 
       "expiresAt": "2017-12-31 23:59:59", 
       "lecturerIds": [ 
       "MON120", 
       "MEL120" 
       ] 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 

Nun, wenn die Anforderung nur die Details ersten verfügbaren Vortrag von Kapitel, Dozent für LIVE-Vorträge gruppiert zurückzukehren und alle Online-Rückkehr Vorträge (zusammen mit anderen Metadaten für das Vorlesungsthema), was ist der beste Weg, das zu tun? Im obigen Beispiel sollten die Vorträge von Dr. Abraham Fisher und Dr. Bob Fisher am 11. September zurückgegeben werden.

Ich habe versucht, mit inner_hits, aber anscheinend Aggregationen verhindert (ich bekomme den folgenden Fehler).

P.S: Die Aggregation muss auf einer Kapitelebene sein und nicht auf der Ebene des Vorlesungsthemas (root).

Antwort

1

Können Sie Ihre Anfrage posten? Für eine Aggregation eines verschachtelten Felds müssen Sie immer den verschachtelten Pfad angeben. Siehe https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-nested-aggregation.html

Ich kenne Ihr vollständiges Datenmodell nicht, aber wenn Sie Kontrolle über die Dokumentstruktur haben und Sie nur für die Suche benötigen, könnten Sie versuchen, es ein wenig mehr durch Denormalisierung zu reduzieren.

Verwandte Themen