Агрегация GeoDistance с вложенными лучшими хитами Агрегация была решением, как предложил Расс Кэм. (Примечание: диапазоны linq есть, поэтому я ищу только тот сегмент, который мне нужен, в зависимости от того, какие минимальные / максимальные значения были введены (включая нули)
if (_isSubjectGeocoded && (filter.DistanceMax.HasValue || filter.DistanceMin.HasValue))
{
search = search.Aggregations(a =>
a.GeoDistance("sale_geo_distance_agg", g =>
g.Field(s => s.GeoLocation)
.Origin(filter.SubjectLatitude.Value, filter.SubjectLongitude.Value)
.Unit(Nest.DistanceUnit.Kilometers)
.Ranges(
r => !filter.DistanceMin.HasValue ?
r.To(_distanceMax) :
!filter.DistanceMax.HasValue ?
r.From(_distanceMin) :
r.From(_distanceMin).To(_distanceMax)
).Aggregations(top =>
top.TopHits("top_geodistance_hits", hits => hits
.Size(_take)
.From(_skip))))
);
}
Мне нужно было применить это позже с
if (_isSubjectGeocoded && (filter.DistanceMax.HasValue || filter.DistanceMin.HasValue))
{
var _geoBuckets = _sales.Aggregations.GeoDistance("sale_geo_distance_agg").Buckets;
Nest.RangeBucket _bucket = _geoBuckets.First();
_totalCount = (int)_bucket.DocCount;
var _bucketHits = _bucket.TopHits("top_geodistance_hits").Documents<SaleSearch>().Select(x => x.SaleId);
_saleDocuments = _saleDocuments.Where(s => _bucketHits.Contains(s.SaleId)).Select(s => s);
}
Моя единственная проблема после этого состояла в том, что у нас изначально были ограничения на страницу до 25/50/100/200/500
Теперь, когда я реализовал топ-хиты, я снизил его до 25/50/100, поскольку топ-хиты поддерживают только до 100, не требуя изменения настроек в эластичном (плюс для нас это все равно излишне. Пейджинг всегда работает)
Надеюсь, это поможет любому, кто столкнется с этим. Хотя я немного поболтал: D