2016-08-03 13 views
7

Ich habe einen Anwendungsfall, in dem ich habe Daten wieeinzigartige Ergebnisse in Elasticsearch

{ 
    name: "John", 
    parentid": "1234", 
    filter: {a: '1', b: '3', c: '4'} 
}, 
{ 
    name: "Tim", 
    parentid": "2222", 
    filter: {a: '2', b: '1', c: '4'} 
}, 
{ 
    name: "Mary", 
    parentid": "1234", 
    filter: {a: '1', b: '3', c: '5'} 
}, 
{ 
    name: "Tom", 
    parentid": "2222", 
    filter: {a: '1', b: '3', c: '1'} 
} 

erwarteten Ergebnisse:

bucket:[{ 
    key: "2222", 
    hits: [{ 
     name: "Tom" ... 
    }, 
    { 
     name: "Tim" ... 
    }] 
}, 
{ 
    key: "1234", 
    hits: [{ 
     name: "John" ... 
    }, 
    { 
     name: "Mary" ... 
    }] 
}] 

Ich möchte von parentid einzigartiges Dokument zurückzukehren. Obwohl ich die Top-Aggregation verwenden kann, kann ich den Bucket nicht paginieren. Da es mehr Chancen gibt, dass parentid anders ist als das selbe. Also wäre mein Bucket-Array groß und ich möchte sie alle zeigen, aber indem ich sie paginiere.

+0

[Paging-Unterstützung für Aggregation] (https://github.com/elastic/elasticsearch/issues/4915) ist noch nicht implementiert. Bitte zeigen Sie eine Beispielantwort, die Sie erhalten möchten, vielleicht gibt es eine andere Möglichkeit, Sie zu bekommen, was Sie brauchen. – Val

+0

Ich habe mit dem erwarteten Ergebnis aktualisiert, jetzt wird meine Bucketlänge viel größer sein. wie gehe ich an dieses Problem heran? –

+0

Es scheint, dass Sie aggregieren nach "parentid" und nicht nach "Filterattribute" wie in Ihrer Frage angegeben. Ihr Ziel ist nicht klar, bitte stellen Sie sicher, dass Sie Ihre Frage so aktualisieren, dass sie genau Ihren Vorstellungen entspricht. – Val

Antwort

1

Es gibt keine direkte Möglichkeit, dies zu tun. Sie können diese Schritte jedoch ausführen, um das gewünschte Ergebnis zu erzielen.

Schritt 1. Sie sollten alle parentid kennen. Diese Daten können erhalten werden, indem Sie eine einfache terms aggregation (Lesen Sie mehr here) auf Feld parentid und Sie erhalten nur die Liste parentid, nicht die Dokumente, die dazu passen. Am Ende haben Sie ein kleineres Array als Sie derzeit erwarten.

{ 
    "aggs": { 
    "parentids": { 
     "terms": { 
     "field": "parentid", 
     "size": 0 
     } 
    } 
    } 
} 

size: 0 ist erforderlich, um alle Ergebnisse zurückzugeben. Lesen Sie mehr here.

ODER

Wenn Sie bereits wissen Liste aller parentid dann können Sie direkt 2.

Schritt 2. Fetch bezogene Dokumente zu Schritt bewegen, indem Dokumente durch parentid Filterung und hier können Sie Paginierung anwenden.

{ 
    "from": 0, 
    "size": 20, 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "term": { 
      "parentid": "2222" 
     } 
     } 
    } 
    } 

} 

from und size für Paginierung verwendet, so können Sie Schleife durch jede parentid in der Liste und alle dazugehörigen Dokumente abzurufen.

-1

Wenn Sie nur für alle Namen gruppiert nach Eltern-ID suchen, können Sie unter Abfrage verwenden:

{ 
     "query": { 
     "match_all": {} 
     },"aggs": { 
     "parent": { 
      "terms": { 
      "field": "parentid", 
      "size": 0 
      },"aggs": { 
      "NAME": { 
       "terms": { 
       "field": "name", 
       "size": 0 
       } 
      } 
      } 
     } 
     },"size": 0 
    } 

Wenn Sie das gesamte Dokument durch parentdId gruppiert werden sollen, wird es ein 2-Stufen-Prozess sein, wie erklärt Sumit oben und Sie können Pagination dort verwenden.

Durch die Aggregation haben Sie nicht Zugriff auf alle Dokumente/Dokument-IDs im agg-Ergebnis. Dies muss also ein zweistufiger Prozess sein.

+0

Gibt es eine Möglichkeit, in Unteraggregation zu paginieren? –

+0

@SumitKumar Meine Antwort aktualisiert. Aus der Frage sah es so aus, als ob er nur nach Namen für alle Eltern-IDs suchte. Nein, es gibt derzeit keine Möglichkeit, über das Aggregationsergebnis zu paginieren. – skgemini

Verwandte Themen