Агрегация на основе двух полей в Elasticsearch приводит к SearchParseExcepetion с невозможностью найти тип агрегатора.

Я использую Elasticsearch 1.4.0 и пробую функцию агрегации. Я продолжаю получать SearchParseException с сообщением Cannot find aggregator type [fieldName] in [aggregationName].

В формате JSON мои данные выглядят следующим образом.

{ "userCode": "abcd123", "response": 1 }
{ "userCode": "abcd123", "response": 1 }
{ "userCode": "abcd123", "response": 0 }
{ "userCode": "wxyz123", "response": 0 }
{ "userCode": "wxyz123", "response": 0 }
{ "userCode": "wxyz123", "response": 1 }

Обратите внимание, что есть 2 пользователя, abcd123 и wxyz123, и я просто хочу подсчитать, сколько раз каждый из них ответил 1 и 0. Если я помещу эти данные в таблицу SQL, в синтаксисе выбора SQL я сделаю что-то вроде этого (если этот пример SQL помогает проиллюстрировать то, что я пытаюсь сделать).

select userCode, response, count(*) as total
from response_table
group by userCode, response

Я ожидаю, что набор результатов будет выглядеть следующим образом.

abcd123, 0, 1 //user abcd123 responded 0 once
abcd123, 1, 2 //user abcd123 responded 1 twice
wxyz123, 0, 2 //user wxyz123 responded 0 twice
wxyz123, 1, 1 //user wxyz123 responded 1 once

Для Elasticsearch моя агрегация JSON выглядит следующим образом.

{
 "aggs": {
  "users": {
   "terms": { "field": "userCode" },
   "aggs": {
    "responses" : {
     "terms": { "field": "response" }
    }
   }
  }
 }
}

Однако я получаю исключение SearchParseException: Cannot find aggregator type [responses] in [aggs]. Что я делаю не так?

Если это поможет, мой файл сопоставления очень прост и выглядит следующим образом.

{
  "data": {
    "properties": {
      "userCode": {
        "type": "string",
        "store": "yes",
        "index": "analyzed",
        "term_vector": "no"
      },
      "response": {
        "type": "integer",
        "store": "yes",
        "index": "analyzed",
        "term_vector": "yes"
      }
    }
  }
}

person Jane Wayne    schedule 28.11.2014    source источник
comment
Код, который вы разместили (включая сопоставления, фактические данные), работает для меня. В 1.4.0.   -  person Andrei Stefan    schedule 28.11.2014


Ответы (1)


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

{
 "aggs": {
  "users": {
   "terms": { "field" : "userCode" },
   "aggs": {
    "responses": {
     "histogram": { "field": "response", "interval": 1 }
    }
   }
  }
 }
}
person Jane Wayne    schedule 28.11.2014
comment
Я неправильно прочитал документацию и подумал, что вложенный aggs был дочерним элементом корня aggs, хотя на самом деле он является частью группы (что также было вашей первоначальной ошибкой). Спасибо за публикацию этого, я сходил с ума, уверен, что все делаю правильно. - person makhdumi; 19.10.2017