При запуске этого:
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);
}
Я уверен, что есть способ, но не могу найти никаких примеров в Интернете. Кто-нибудь делал что-то подобное?