Как получить свойства класса агрегации ответа NEST Elasticsearch? - PullRequest
0 голосов
/ 03 июня 2019

При запуске этого:

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 Ответ

1 голос
/ 03 июня 2019

Я пропустил несколько важных строк в документах :

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);
}
...