Как выполнить СУММУ и считать в NEST? - PullRequest
0 голосов
/ 05 января 2020

У меня есть ниже POCO

public class Collection
    {        
        public string Amount { get; set; }

        public string AccountId { get; set; }

        public string ReceiptId { get; set; }

    }

Я ищу

a) Сумма суммы b) Количество ReceiptId

группировка по AccountId с использованием Nest.

, поскольку я новичок в Elasti c Поиск и Nest, у меня возникли трудности при создании запроса.

Вот что у меня есть до сих пор пробовал

 var result = ConnectionToES.EsClient().Search<Collection>(s => s
                    .Index("collections")
                    .Aggregations(a => a

                        .Terms("ReceiptId", ts => ts
                            .Field(o => o.AccountId)
                            .Aggregations(aa => aa.Sum("Amount", sa => sa.Field(o => Convert.ToDecimal(o.Amount)))

                            )
                        )
                    )
                );

Но когда я делаю то же самое с помощью LINQ, это работает

var res = ConnectionToES.EsClient().Search<Collection>(s => s
            .Index("collections")
            .From(0)
            .Size(1000)
            .Query(q => q.MatchAll()));

            List<Collection> objCollection = new List<Collection>();

            foreach (var hit in res.Hits)
            {
                objCollection.Add(
                    new Collection
                    {
                        Id = hit.Source.Id.ToString()
                         ,

                        Amount = string.IsNullOrEmpty(hit.Source.Amount.ToString()) ? "0" : hit.Source.Amount.ToString()
                         ,
                        AccountId = hit.Source.AccountId.ToString()
                         ,
                        ReceiptId = hit.Source.ReceiptId.ToString()

                         ,
                        CollectorId = hit.Source.CollectorId.ToString()
                         ,
                        CollectionDate = hit.Source.CollectionDate.ToString()

                    });
            }

            var aggrResult = objCollection.GroupBy(t => t.AccountId)
                           .Select(t => new
                           {
                               AccountNumber = t.Key,
                               Count = t.Count(),
                               Amount = t.Sum(item => Convert.ToDouble(item.Amount)),
                           }).ToList();

Я хочу выполнить ту же агрегацию в ES-способе.

1 Ответ

0 голосов
/ 06 января 2020

Пара указателей в помощь

  1. Amount должна быть числовым значением c (возможно, double?), Чтобы выполнить суммирование по нему.
  2. Агрегирование терминов в AccountId выглядит так, как если бы оно было ReceiptId, для значений ReceiptId. Кроме того, если ReceiptId является строковым значением, которое не нуждается в полнотекстовом поиске, оно должно быть отображено как тип данных keyword, который позволит выполнять агрегацию, сортировку и запросы на уровне терминов.
...