Агрегировать поле ElasticSearch, отсортированное по дате - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть документы, хранящиеся в моем индексе, и я хочу объединить все документы по ключу и взять для каждого из результатов агрегации, отсортированных по убыванию, определенное поле последнего документа.

Мое сопоставление выглядит следующим образом:

    {
     "mapping": {
        "campaignbudgetrecord": {
            "properties": {
                "campaignBudget": {
                "type": "nested",
                "properties": {
                    "accountId": {
                    "type": "integer"
                    },
                    "advertiserId": {
                    "type": "integer"
                    },
                    "budget": {
                    "type": "double"
                    },
                    "budgetType": {
                    "type": "integer"
                    },
                    "campaignId": {
                    "type": "integer"
                    },
                    "paid": {
                    "type": "double"
                    },
                    "paidDaily": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                        }
                    }
                    },
                    "paidToday": {
                    "type": "double"
                    },
                    "totalBudget": {
                    "type": "double"
                    }
                }
                },
                "campaignBudgetDate": {
                "type": "date"
                }
            }
        }
    }
}

Подводя итог, я хотел бы объединить все мои CampaignBudgetRecords по ключу (accountId), отсортированные по campaignBudgetDate, и суммировать totalBudget каждой из последней записи, чтобы получитьобщий бюджет моего аккаунта из его кампаний.

Я пытался сделать это, используя это:

var accountBudgetResponse = await elasticClient.SearchAsync<CampaignBudgetRecord>(s =>
    s.Index(_variableService.ElasticSearchCampaignBudgetIndexName).Type(typeof(CampaignBudgetRecord))
        .Aggregations(a => a.Nested("Budget", n => n.Path(p => p.CampaignBudget)
            .Aggregations(ag => ag
                .Terms("ByCampaignId", tad => tad
                    .Field(o => o.CampaignBudget.CampaignId)))
            .Aggregations(ad => ad
                .Terms("CampaignTotalBudget", sad => sad
                    .Field(o => o.CampaignBudget.TotalBudget)
                ))
            .Aggregations(ad => ad
                .Sum("AccountTotalBudget", sad => sad
                    .Field(o => o.CampaignBudget.TotalBudget)
                )))).Sort(ss => ss.Field(f => f.Field(ff => ff.CampaignBudgetDate).Order(SortOrder.Descending))).Query(q => q.Nested(n =>
            n.Path(p => p.CampaignBudget).Query(qq => qq.Bool(b =>
                b.Must(m => m.Match(a =>
                    a.Field(f => f.CampaignBudget.AccountId).Query(visualizationEntity.EntityId.ToString()))))))).Size(0));

Но я получаю корзину с суммой всего итогового бюджета, дажете, которые поступают из одного и того же идентификатора campaignBudget campaignId, поэтому он не агрегирует последний из каждого рекламного кампании.Я прочитал несколько примеров из документации NEST.NET, но мне не удалось заставить его работать, и я застрял.

...