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