ElasticSearch GeoDistance范围

时间:2018-10-26 06:27:14

标签: c# elasticsearch nest

随着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 :(得分:0)

如Russ Cam所建议的,具有嵌套的热门匹配的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