Как получить среднее значение от AvgAggregationBuilder elasti c поиск ключей spesifi c - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь получить результаты поиска Elasti c со spesi c, например:

средняя зарплата, по городу, полу

, поэтому я проверяю на metrics_aggregations

, и я смог

AvgAggregationBuilder totalDuration = AggregationBuilders.avg("salaryAvg").field("salary");

вернуть действительно самый высокий уровень - средняя зарплата без указания c fields

Поэтому я попытался использовать subAggregation

AvgAggregationBuilder totalDuration =     AggregationBuilders
            .avg("salaryAvg").field("salary")
            .subAggregation(AggregationBuilders.terms("city").field("gender"));

, но я получил ошибку ниже

Ошибка сервера. 21525 \ nElasticsearchStatusException [Исключение Elasticsearch [тип = aggregation_initialization_exception, причина = Aggregator [salaryAvg] типа [avg] не может принимать подгруппы]] \ n \ tat org.elasticsearch.rest.BytesRestResponse.errorFromXConten *

1025 * * как я могу запросить его с помощью elasti c искать то, что я хочу, что-то очень похожее на SQL - группировать по

каждая строка моих данных ответа elasti c выглядит так:

widgetResponse.getHits().getHits()[0].getSourceAsMap().get("attributes")


{HashMap$Node@53898} "city" -> "new York"
{HashMap$Node@53899} "pageId" -> "123"
{HashMap$Node@53900} "salary" -> "45765"
{HashMap$Node@53900} "gender" -> "female"
{HashMap$Node@53901} "userId" -> "324"
{HashMap$Node@53902} "accountId" -> "456"


widgetResponse.getHits().getHits()[1].getSourceAsMap().get("attributes")


{HashMap$Node@53898} "city" -> "new Jersy"
{HashMap$Node@53899} "pageId" -> "123"
{HashMap$Node@53899} "salary" -> "77777"
{HashMap$Node@53900} "gender" -> "female"
{HashMap$Node@53901} "userId" -> "334"
{HashMap$Node@53902} "accountId" -> "999"

Как я могу поддержать его с помощью Elasti c search JAVA API?

Я также пытался

запустить его:

        AvgAggregationBuilder totalDuration0 = AggregationBuilders.avg(TOTAL_DURATION_AVG).field(TOTAL_DURATION);
    TermsAggregationBuilder totalDuration = AggregationBuilders.terms(TOTAL_DURATION_AVG)
            .field(ATTRIBUTES_WIDGET_ID).subAggregation(totalDuration0);

Я получил этот ответ

, кажется, имеет другое среднее значение и сколько строк для каждой строки в этом списке, но я не знаю, на какой «ключ» указывает массив байтов

, но он не соответствует фактическому ключу, который у меня есть, также [ключ], кажется, дублируется с другим средним значением, так что мне здесь не хватает. ?

enter image description here

1 Ответ

0 голосов
/ 17 марта 2020

Мне удалось получить среднее значение по одному полю, но не более чем по одному полю

    final AvgAggregationBuilder totalDuration = AggregationBuilders.avg(avgSalary).field(SALARY_AVG);
    final TermsAggregationBuilder totalDurationByWidgetId = AggregationBuilders.terms(SALARY_AVG)
            .field(GENDER).subAggregation(avgSalary);
...