Проблема с эластичным агрегированием суммы поиска

Я пытаюсь использовать пример с сайта эластичного поиска со своими параметрами, но он не работает.

Запрос:

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "range": {
          "activity_date": {
            "from": "2013-11-01",
            "to": "2014-11-01"
          }
        }
      }
    }
  },
  "aggs": {
    "net_ordered_units": {
      "sum": {
        "field": "net_ordered_units"
      }
    }
  }
}

Ошибка, которую я получаю:

{
  "error": "SearchPhaseExecutionException[Failed to execute phase [query_fetch], all shards failed; shardFailures {[YoGKlejVTC6jhg_OgPWXyTg][test][0]: SearchParseException[[test][0]: query[ConstantScore(cache(activity_date:[1383264000000 TO 1414886399999]))],from[-1],size[-1]: Parse Failure [Failed to parse source [{\"query\": {\"filtered\":{\"query\":{\"match_all\":{}},\"filter\":{\"range\":{\"activity_date\":{\"from\":\"2013-11-01\",\"to\":\"2014-11-01\"}}}}},\"aggs\":{\"net_ordered_units\":{\"sum\": {\"field\":\"net_ordered_units\"}}}}]]]; nested: SearchParseException[[test][0]: query[ConstantScore(cache(activity_date:[1383264000000 TO 1414886399999]))],from[-1],size[-1]: Parse Failure [No parser for element [aggs]]]; }]", 
  "status": 400
}

При чем здесь провал шарда? И пишет нет парсера для аггов, что тут делать? По сути, мне нужно выполнить такие операции, как сумма, а затем найти из нее максимум. Как мне изменить приведенный выше код, чтобы получить это?


person thirstylad    schedule 22.05.2014    source источник
comment
Используете ли вы какой-либо плагин для администрирования вашего кластера?   -  person eliasah    schedule 22.05.2014
comment
@eliasah Да, плагин внутренней оболочки.   -  person thirstylad    schedule 22.05.2014
comment
Вы используете Elasticsearch 1.0.0 или новее?   -  person Alex Brasetvik    schedule 22.05.2014
comment
@AlexBrasetvik ES 1.0.0, это имеет значение?   -  person thirstylad    schedule 22.05.2014
comment
Этот поиск должен работать на чем угодно ›= 1.0.0 и выдавать ошибку, подобную той, что у вас есть в более старых версиях, поскольку агрегации были введены в 1.0.0.   -  person Alex Brasetvik    schedule 22.05.2014
comment
Возможно, у вас упал осколок. Вот почему я спросил вас о плагине администратора. Вам нужно что-то вроде плагина elasticsearch head, чтобы вы могли визуализировать свой кластер: состояние, состояние, метаданные и т. д.   -  person eliasah    schedule 22.05.2014
comment
@AlexBrasetvik Нет ли другого способа получить сумму, кроме агрегации?   -  person thirstylad    schedule 22.05.2014
comment
Ключевым здесь является No parser for element [aggs]] часть сообщения об ошибке. Попробуйте запустить curl localhost:9200/_search -d '{"bogus_field_that_is_not_valid_in_a_search_object": {}}', и вы все равно получите ошибку сегмента, обертывающую ошибку синтаксического анализа. :)   -  person Alex Brasetvik    schedule 22.05.2014


Ответы (1)


Я думаю, что ваш плагин (который вы используете для выполнения эластичных поисковых запросов на основе CURL) не может анализировать тег «aggs». Я использую плагин Marvel Sense (http://www.elasticsearch.org/guide/en/marvel/current/) специально для запросов ES, и ваш запрос работает нормально! Я провел тест на Postman (плагин RESTful Chrome) и угадайте, что с вашим запросом все в порядке... Так что попробуйте переключить свой плагин и посмотрите, поможет ли это.

Обновлено: чтобы ответить на вторую часть вашего вопроса,

curl -s -XPOST  your_ES_server/ES_index/url_to_query -d    
'{"query": 
  {"bool": 
   { 
   "must": [{ 
 "wildcard" : { "item_id" : "*" }
          }]
  }
 },
 "facets" : {
  "facet_result":
    {"terms":{
      "fields":["item_count"]
    }}

}

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

 "facets": {
  "facet_result": {
     "_type": "terms",
     "missing": 0,
     "total": 35,
     "other": 0,
     "terms": [
        {
           "term": 0,
           "count": 34
        },
        {
           "term": 2,
           "count": 1
        }
     ]
  }
}

Это может быть не чистое решение, но может помочь вам получить максимальную (сумму) ключа. Для получения дополнительной информации о заказе см. http://www.elasticsearch.org/guide/en/elasticsearch/reference/0.90/search-facets-terms-facet.html#_ordering

person skippy    schedule 22.05.2014
comment
Спасибо за эту информацию, я попробую изменить плагин и изучить его. Переходя ко второй части, я думаю, что ваш запрос действительно находит сумму и максимум поля, тогда как я хочу сначала найти сумму, а затем максимум среди значений суммы. Что-то вроде max(sum) в SQL-запросе. - person thirstylad; 22.05.2014
comment
Просто для моего понимания, чтобы подтвердить, фасеты действуют как группа (в SQL), чтобы сгруппировать все похожие термины и вернуть их количество. Используя упорядочение, мы сортируем в порядке убывания количества и извлекаем первый элемент, чтобы получить от него максимум. Я прав ? - person thirstylad; 23.05.2014
comment
@thirstylad: В точку! - person skippy; 23.05.2014