c# - Elasticsearch-按分数过滤前N个文档,然后按字段排序

标签 c# sorting elasticsearch nest elasticsearch-5

我正在使用带有Nest 5.6的Elastic Search,我只希望筛选分数最高的文档,然后按其他字段排序。问题是排序是在得分和字段之间一起进行的,但是我只想对得分最高的TOP(N)条记录进行排序。
例如,按分数排序和该项目的较低值将导致下表:

  • 得分 | 项目值
  • 0.8 | 7.0
  • 0.8 | 8.0
  • 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())
              ));
    

    有人对如何解决此问题有任何想法吗?

    最佳答案

    我本人最近有这个问题。这是您遇到的问题:

    分片:每个索引由一些分片组成,可帮助您在节点之间分配索引。但这也意味着在管道中间获取任何东西的准确计数是非常容易的。这就是存储桶式聚合仅为您提供最佳结果的近似值的原因。它针对各个分片运行计算,并智能地对其进行组合。

    这就是我最终要做的事情-记住,这不会很准确,因为据我所知,实际上并没有很好的方法。

    使用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/

    相关文章:

    c# - 在 PHP 中是否有与 C# 的 Process.Start 等效的东西?

    python - 在 Python 中按创建日期排序文件列表时出现奇怪的错误

    ElasticSearch - 使用连字符搜索

    algorithm - 合并排序与基数排序 : Merge sort taking O(n (log n)^2) time in special cases?

    elasticsearch - 通过POST调用ElasticSearch运行状况检查

    search - Lucene 中的查询运行时间和索引大小

    c# - 如何在 Razor View 中测试 lambda 表达式?

    c# - 在 C# 中将双色 TIFF 转换为双色 PNG

    c# - 错误:Cannot implicitly convert type 'System.DateTime' to 'System.Data.Common.DbParameter'

    c - 按字母顺序对 C 原型(prototype)进行排序的 Unixy 方式