Не удается выбрать субагрегацию в Nest

Я получаю эти результаты в своем эластичном запросе:

"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. Что мне не хватает?

Это помогает? astic.co/guide/en/elasticsearch/client/net-api/current/…

Joe - ElasticsearchBook.com 14.12.2020 11:24

Привет Джо, большое спасибо за всю вашу помощь в эти последние 2 недели. Я придумал решение, просто преобразовав свойство Buckets в NewtonSoft JObject и используя NewtonSoft для получения нужных мне данных. Это 3 строки кода, две из которых — очень простые запросы Linq Select. Это хакерский, но очень короткий и читаемый. И, что удивительно, короче, чем любой из официальных примеров Elastic, которые я видел до сих пор.

yesman 14.12.2020 11:47

Какой запрос и полный ответ?

Russ Cam 15.12.2020 01:47
0
3
208
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая следующий запрос, который, я думаю, будет соответствовать ответу на вопрос

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.

yesman 15.12.2020 08:56

Другие вопросы по теме