簡體   English   中英

Elastic Seach-按分數過濾前N個文檔,然后按字段排序

[英]Elastic Seach - filter top N documents by score and then sort by field

我正在使用帶有Nest 5.6的Elastic Search,我只想過濾得分最高的100個文檔, 然后按其他任何字段排序。 問題是排序是在分數和字段之間一起進行的,但是我只想對得分最高的TOP(N)條記錄進行排序。 例如,按分數排序和項目的較低值將導致下表:

  • 分數 | 物品價值
  • 0.8 | 7
  • 0.8 | 8
  • 0.7 | 6.0- 價格保持不變。

我的查詢如下:

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM