Stellen Sie sich vor, dass ich einen Besuch Index haben, der Dokumente des Typs ‚Besuch‘ enthält, die wie folgt aussehen:Wie kann ich meine Daten umformen, bevor ich sie in ein Histogramm umwandele?
{
"id": "c223a991-b4e7-4333-ba45-a576010b568b",
// other properties
"buildingId": "48da1a81-fa73-4d4f-aa22-a5750162ed1e",
"arrivalDateTimeUtc": "2015-12-22T21:15:00Z"
}
Die folgende Funktion wird ein Histogramm zurück, die im angegebenen Bereich für jeden Tag Eimer Besuche kehrt nach zur angegebenen Zeitzone.
public Bucket<HistogramItem> Execute(MyParameterType parameters)
{
var buildingFilter = Filter<VisitProjection>.Term(x => x.BuildingId, parameters.BuildingId);
var dateFilter = Filter<VisitProjection>.Range(r => r
.OnField(p => p.ArrivalDateTimeUtc)
.GreaterOrEquals(parameters.EarliestArrivalDateTimeUtc)
.LowerOrEquals(parameters.LatestArrivalDateTimeUtc)
);
var result = _elasticClient.Search<VisitProjection>(s => s
.Index("visits")
.Type("visit")
.Aggregations(a => a
.Filter("my_filter_agg", f => f
.Filter(fd => buildingFilter && dateFilter)
.Aggregations(ta => ta.DateHistogram("my_date_histogram", h => h
.Field(p => p.ArrivalDateTimeUtc)
.Interval(parameters.DateInterval) // "day"
.TimeZone(NodaTimeHelpers.WindowsToIana(parameters.TimeZoneInfo)) // This is a critical piece of the equation.
.MinimumDocumentCount(0)
)
)
)
)
);
return result.Aggs.Nested("my_filter_agg").DateHistogram("my_date_histogram");
}
}
// Returns [{Date: 12/22/2015 12:00:00 AM, DocCount: 1}]
Nun stell dir vor, dass ich die Dinge ein wenig verändert werden. Stellen Sie sich vor, dass ich ein neues Feld in dem Dokument hinzugefügt:
{
"id": "c223a991-b4e7-4333-ba45-a576010b568b",
// other properties
"buildingId": "48da1a81-fa73-4d4f-aa22-a5750162ed1e",
"arrivalDateTimeUtc": "2015-12-22T21:15:00Z",
"departureDateTimeUtc": "2015-12-23T22:00:00Z" // new property
}
Und davon ausgehen, dass ich folgendes zurückkehren wollen:
// Returns [{Date: 12/22/2015 12:00:00 AM, DocCount: 1}, {Date: 12/23/2015 12:00:00 AM, DocCount: 1}]
weil der Besuch überspannte zwei Tage und ich will ein Datum Histogramm, das eine aufzeichnet Einheit für jeden Tag, den ein Besuch überspannt.
Wie würde ich das mit NEST/Elastic Search machen?
Anmerkung 1: Es sei denn, jemand kann mir sonst überzeugt, ich glaube nicht eine gute Idee wäre, alle Dokumente im Bereich zu sammeln und die Aggregation/bucketization und Datum Histogramm in der mittleren Ebene (oder C# ausführen Schicht).
Hinweis 2: Der Zeitzonenaspekt dieses Problems ist kritisch, da ich die Anzahl der zu definierenden Zeitzonen benötigen.