我正在使用带有Nest 5.6的Elastic Search,我只希望筛选分数最高的文档,然后按其他字段排序。问题是排序是在得分和字段之间一起进行的,但是我只想对得分最高的TOP(N)条记录进行排序。
例如,按分数排序和该项目的较低值将导致下表:
我的查询如下:
client.Search<ItemDto>(s => s
.From(0)
.Size(100)
.Index(INDEX)
.Query(q => q
.Bool(b => b.Must(query)))
.Sort(y=>y
.Descending(SortSpecialField.Score)
.Field(f=>f.Field(new Field("itemValue")).Ascending())
));
有人对如何解决此问题有任何想法吗?
最佳答案
我本人最近有这个问题。这是您遇到的问题:
分片:每个索引由一些分片组成,可帮助您在节点之间分配索引。但这也意味着在管道中间获取任何东西的准确计数是非常容易的。这就是存储桶式聚合仅为您提供最佳结果的近似值的原因。它针对各个分片运行计算,并智能地对其进行组合。
这就是我最终要做的事情-记住,这不会很准确,因为据我所知,实际上并没有很好的方法。
使用Sampler Aggregation拉(大约)前100名。您将“碎片大小”指定为返回的结果数除以碎片数。假设您有5个分片(默认值),则每个分片请求20个文档。
然后,在该采样器聚合中,您可以添加Top Hits Aggregation以实际获取源文档,并根据需要对其进行排序。
new SamplerAggregation("sampler_aggregation")
{
ShardSize = maxResults / SHARD_NUMBER,
Aggregations = new TopHitsAggregation("top_hits")
{
Sort = {Whatever},
Size = maxResults
}
}
然后访问您的文档
searchResponse.Aggs.Sampler("sampler_aggregation")
.TopHits("top_hits")
.Documents<YourType>().ToArray()
但是:如果您非常想获得非常准确的结果,那么最好只按相关性排序并获得前100名。然后再将结果再次存储在内存中即可。
关于c# - Elasticsearch-按分数过滤前N个文档,然后按字段排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48443030/