Я получаю эти результаты в своем эластичном запросе:
"Results" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "73c47133-8656-45e7-9499-14f52df07b70",
"doc_count" : 1,
"foo" : {
"doc_count" : 40,
"bar" : {
"doc_count" : 1,
"customscore" : {
"value" : 10.496919917864476
}
}
}
}
]
Я пытаюсь получить список анонимных объектов с полем key
в качестве ключа и полем customscore
в качестве значения.
Что бы я ни пытался, я не могу написать в Nest код, который обращается к значению customscore
. Судя по всему, я самый первый человек в мире, который использует вложенные агрегаты с библиотекой Nest. Либо так, либо документации очень не хватает. Я могу легко добраться до ведер:
response?.Aggregations.Terms("Results").Buckets;
Но я понятия не имею, что делать с этим объектом. Buckets
содержит несколько объектов, по которым, как я полагаю, я мог бы перемещаться, выполнив следующие действия:
bucketObject["foo"]["bar"]["customscore"]
Но видимо нет. Я нашел решения, которые используют циклы for, решения с длинными запросами Linq, и все они, похоже, возвращают мне null
. Что мне не хватает?
Привет Джо, большое спасибо за всю вашу помощь в эти последние 2 недели. Я придумал решение, просто преобразовав свойство Buckets в NewtonSoft JObject
и используя NewtonSoft для получения нужных мне данных. Это 3 строки кода, две из которых — очень простые запросы Linq Select. Это хакерский, но очень короткий и читаемый. И, что удивительно, короче, чем любой из официальных примеров Elastic, которые я видел до сих пор.
Какой запрос и полный ответ?
Предполагая следующий запрос, который, я думаю, будет соответствовать ответу на вопрос
var client = new ElasticClient();
var response = client.Search<object>(s => s
.Index("some_index")
.Aggregations(a => a
.Terms("Results", t => t
.Field("some_field")
.Aggregations(aa => aa
.Filter("foo", f => f
.Filter(q => q.MatchAll())
.Aggregations(aaa => aaa
.Filter("bar", ff => ff
.Filter(q => q.MatchAll())
.Aggregations(aaaa => aaaa
.ValueCount("customscore", vc => vc
.Field("some_other_field")
)
)
)
)
)
)
)
)
);
Чтобы получить коллекцию анонимных типов, нужно
var kvs = response.Aggregations.Terms("Results").Buckets
.Select(b => new
{
key = b.Key,
value = b.Filter("foo").Filter("bar").ValueCount("customscore").Value
});
.Aggregations предоставляет методы, которые преобразуют ответ IAggregate в ожидаемый тип
Спасибо, Расс, это работает для меня. Извините, что не ответил на ваш предыдущий комментарий, я был занят сном. :) Одна вещь, хотя я, вероятно, очень плохо ищу, но даже с Google и зная, что я ищу, я не могу найти примеры кода с использованием Filter и ValueCount на страницах документации ElasticSearch. Учитывая, насколько легко эти методы упрощают поиск по всему ответу JSON от Elastic, в документации может потребоваться более подробное рассмотрение этой темы. Это также может быть связано с тем, что я относительно новичок в Elastic.
Это помогает? astic.co/guide/en/elasticsearch/client/net-api/current/…