【问题标题】:ElasticSearch GeoDistance RangeElasticSearch GeoDistance 范围
【发布时间】:2018-11-12 07:26:13
【问题描述】:

随着 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)));

【问题讨论】:

  • 具有嵌套热门点击聚合的地理距离聚合是否适用于您的用例?
  • 谢谢拉斯,正是我需要使用的。
  • 乐于助人:)

标签: c# elasticsearch nest


【解决方案1】:

具有嵌套 Top hits 聚合的 GeoDistance 聚合是 Russ Cam 建议的解决方案。 (注意:范围 linq 在那里,所以我只搜索我需要的存储桶,具体取决于输入的 Min / Max 值(包括空值)

        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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多