[英]Elastic Seach - filter top N documents by score and then sort by field
我正在使用帶有Nest 5.6的Elastic Search,我只想過濾得分最高的100個文檔, 然后按其他任何字段排序。 問題是排序是在分數和字段之間一起進行的,但是我只想對得分最高的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())
));
有人對如何解決此問題有任何想法嗎?
我本人最近有這個問題。 這是您遇到的問題:
分片 :每個索引由一定數量的分片組成,可幫助您在節點之間分配索引。 但這也意味着在管道中間獲取任何東西的精確計數是非常容易的。 這就是存儲桶式聚合僅為您提供最佳結果的近似值的原因。 它針對各個分片運行計算,並智能地對其進行組合。
這就是我最終要做的事情-請記住,這不會很准確,因為據我所知,實際上並沒有很好的方法。
使用“ 采樣器聚合”將(大約)拉到前100名。您將“碎片大小”指定為返回的結果數除以碎片數。 假設您有5個分片(默認值),則每個分片請求20個文檔。
然后,在該采樣器聚合中,您可以添加“ 熱門匹配”聚合以實際獲取源文檔,並根據需要對其進行排序。
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名。然后再在內存中再次對結果進行排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.