如何获取Elasticsearch NEST响应的聚合类属性?

时间:2019-06-03 12:38:58

标签: c# elasticsearch nest

运行时:

searchResponse = _elasticClient.Search<Assets>(s => s
                .Aggregations(a => a
                    .Filter("myFilter", f => f
                        .Filter(fi => fi
                            .Bool(b => b
                                .Must(
                                    m => m.Term(t => t.TitleType, type),
                                    m => m.Term(t => t.Categories, category))))
                        .Aggregations(aggs => aggs
                            .Terms("myUnique", te => te
                                .Field(f1 => f1.Genres))))));

我得到这个答复:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 50751,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "myFilter" : {
      "doc_count" : 50281,
      "myUnique" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 0,
        "buckets" : [
          {
            "key" : "Other",
            "doc_count" : 9879
          },
          {
            "key" : "Anime",
            "doc_count" : 5948
          },
          {
            "key" : "Reality",
            "doc_count" : 4354
          },
          {
            "key" : "Drama",
            "doc_count" : 3333
          }
        ]
      }
    }
  }
}

这正是我想要的。但是,我不知道如何在响应中访问类属性。我认为类似的方法会起作用:

agg = searchResponse.Aggregations.Terms("myFilter.myUnique"); // Does not work!

我想获取在上面找到的汇总响应中找到的所有“键”,例如戏剧,现实等

我的目标是在上面的代码行之后运行此代码:

foreach (var genre in agg.Buckets)
                {
                    var value = genre.Key;
                    var count = genre.DocCount;

                    DoSomething(value, count);

                }

我敢肯定有办法,但是在网上找不到任何例子。有人做过类似的事情吗?

1 个答案:

答案 0 :(得分:1)

docs中,我完全错过了几行:

var filterAgg = searchResponse.Aggregations.Filter("myFilter");

var terms = filterAgg.Terms("myUnique");

然后我可以做:

foreach (var genre in terms.Buckets)
{
    var value = genre.Key;
    var count = genre.DocCount;

    DoSomething(value, count);
}