在特定文档的 Nest elasticsearch 中使用 Terms 聚合

Using Terms aggregation in Nest elasticsearch for a specific document

我想获取特定文档内容字段中的热门术语。 我怎样才能做到这一点? 到目前为止,我已经尝试了下面的代码,但听起来好像对特定文档 ID 的过滤不起作用。

 var result = client.Search<Document>(s => s.Index(defaultIndex).Filter(f => f.Term(t => t.Id, ID)).
     Aggregations(a => a.Terms("terms_agg",
     sa => sa.Field(p => p.File).Size(20))));
    var agg = result.Aggs.Terms("terms_agg");

有谁知道是否可以使用 Terms 聚合获取特定内容中的热门术语列表?或者elasticsearch有没有其他方法可以做到?

您需要为此使用过滤查询。

var result = client.Search<Document>(s => s
    .Index(defaultIndex)
    .Query(q => q
        .Filtered(fq => fq
            .Filter(f => f
                .Term(t => t.Id, ID))))
    .Aggregations(a => a
        .Terms(
            "terms_agg",
            sa => sa.Field(p => p.File)
    .Size(20))));
var agg = result.Aggs.Terms("terms_agg");

原因是聚合范围是顶级 "query" 部分匹配的文档。您使用的过滤器是 post 过滤器。 post 过滤器的结果不会影响聚合的文档范围。在您的请求中,"query" 部分隐含地是一个 "match_all" 查询,因此您会看到多个文档被聚合。通过在顶级查询部分强制使用文档过滤器,您可以限制聚合范围。