Термины Агрегации полей - PullRequest
       22

Термины Агрегации полей

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

Я нахожусь в процессе чтения данных из метрик и хочу прочитать выбранный в последний день / время. Я использую агрегаты, чтобы получить первое место, но где-то не получилось, так как результат, полученный по запросу, не совпадает с последним Может быть, мне не хватает где-то. Это мой последний запрос

var elasticResponse = elasticClient.Search<object>(s => s
                .Aggregations(ag => ag
                    .Terms("cpu_aggs", sa => sa.Field("system.cpu.total.pct").Size(1))
                    .Terms("memory_aggs", sa => sa.Field("system.memory.actual.used.pct").Size(1))
                    .Terms("diskio_aggs", sa => sa.Field("docker.diskio.summary.bytes").Size(1))
                    .Terms("load_aggs", sa => sa.Field("system.load.5").Size(1))
                )
                .Sort(so => so.Descending("@timestamp"))
            );

Пожалуйста, помогите найти правильное решение.

Обновленное решение -

.Terms(currentMemoryUsageInPercent, sa => sa.Field("system.memory.actual.used.pct").Size(1).Order(o => o.Descending("max_timestamp"))
                .Aggregations(agg => agg.Max("max_timestamp", mx => mx.Field(greoupByFieldName))))

1 Ответ

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

Чего вы пытаетесь достичь?

Агрегирование группируется

.Aggregations(ag => ag
                     .Terms("cpu_aggs", sa => sa.Field("system.cpu.total.pct").Size(1))
                     .Terms("memory_aggs", sa => sa.Field("system.memory.actual.used.pct").Size(1))
                     .Terms("diskio_aggs", sa => sa.Field("docker.diskio.summary.bytes").Size(1))
                     .Terms("load_aggs", sa => sa.Field("system.load.5").Size(1))
                 )




.Terms("cpu_aggs", sa => sa.Field("system.cpu.total.pct").Size(1)



 Means you want the most (and only because of the size(1) system.cpu.total.pct in your data 
    then

.Terms("memory_aggs", sa => sa.Field("system.memory.actual.used.pct").Size(1)) => наибольшим значением system.memory.actual.used.pct и т. Д.

All these aggregation are at the same level, so you will have most reccurent pct, most recurent memory, more recurent bytes ect...Each of these aggregations is independant and will scan all your document.



    Your sort is not apply to aggregation, it will be apply to your query, by default, 10 documents are returned, so it will return the last 10 documents.

Агрегация выполняется для анализа различных документов (возврат, среднее, максимальное, количество, сумма ...).

Например, что вы можете сделать:

сначала , если вы хотите работать только с агрегацией, не запрашивайте документ, поставьте .Size (0).

var elasticResponse = Client.Search<object>(s => s
                .Size(0)
                 .Aggregations(ag => ag

Если вы хотите произвести агрегацию в поле, получите, например, еще 10 рекуррентных значение:

.Terms("cpu_aggs", sa => sa.Field("system.cpu.total.pct").Size(10)

Если вы хотите, чтобы еще 10 повторяющихся «system.cpu.total.pct» с последним документом для каждого из них

.Terms("cpu_aggs", sa => sa.Field("system.cpu.total.pct")).TopHits("topcpu", r => r.Field("@timestamp").Sort(ss => ss.Descending()).Size(1)))

Если вы хотите 10 более рекуррентный "cpu_aggs", и когда для каждого из этого верхнего значения процессора 5 верхних "system.load.5"

.Terms("cpu_aggs", sa => sa.Field("docker.diskio.summary.bytes").Size(10)
                        .Aggregations(subag => subag.Terms("subaggr", sua => sua.Field("system.load.5").Size(5))
                     ))

, если вам нужна статистика (если system.cpu.total.pct - это число например)

.Stats("cpu_stats", sa => sa.Field("system.cpu.total.pct"))

Если вам нужен только последний документ, вам не нужно агрегировать:

var elasticResponse = elasticClient.Search<object>(s => s
                .Size(1)
                .Sort(so => so.Descending("@timestamp"))
            );

Если это не ответ на ваш вопрос просьба уточнить, и присоединиться к примеру того, что вам нужно.

...