ElasticSearch GeoDistance Range - PullRequest
       9

ElasticSearch GeoDistance Range

0 голосов
/ 26 октября 2018

С обновлением ElasticSearch (с 2.x до 6.3) мы утратили функциональность использования минимального максимального диапазона для нашего поиска.

Ранее мы использовали это для создания «поиска по пончику».Мы не хотели, чтобы объекты находились очень близко, но между диапазонами.

Просто пытаюсь выяснить, есть ли какой-нибудь возможный способ сделать это в более новой версии.Посмотрел документы и не увидел ничего, что поможет.

f.GeoDistanceRange(x => x
Field(s => s.GeoLocation)
.Location(new Nest.GeoLocation(filter.SubjectLatitude.Value, 
filter.SubjectLongitude.Value))
.GreaterThanOrEqualTo(Nest.Distance.Kilometers(_distanceMin))
.LessThanOrEqualTo(Nest.Distance.Kilometers(_distanceMax)));

1 Ответ

0 голосов
/ 12 ноября 2018

Агрегация 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

...