2016-04-05 2 views
1

У меня есть запрос ES, который возвращает около 26 результатов.Гистограмма агрегации elasticsearch по дате больше не работает со сценарием

Запрос имеет агрегации гистограммы элемент, который выглядит следующим образом:

"aggregations" : { 
    "by_date" : { 
     "date_histogram" : { 
     "field" : "startDate", 
     "interval" : "month" 
     } 
    } 
} 

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

"aggregations": { 
    "date_histogram": { 
     "buckets":[ 
     {"key_as_string":"2016-01-01T00:00:00.000Z", "key":1451606400000, "doc_count":18}, 
     {"key_as_string":"2016-02-01T00:00:00.000Z", "key":1454284800000, "doc_count":8} 
     ] 
    } 
} 

До сих пор так хорошо. Но я хочу сделать некоторые скрипты против результатов поиска, чтобы удалить элементы, не соответствующие определенным критериям. Поэтому я добавил это к запросу:

"aggregations" : { 
    "by_date" : { 
     "date_histogram" : { 
     "field" : "startDate", 
     "interval" : "month", 
     "script" : { 
      "inline" : "if (condition) {return 1} else {return 0}" 
     } 
    } 
} 

К сожалению, это приводит к результату одного ведра и агрегация теряется:

"date_histogram": { 
    "buckets": [ 
     {"key_as_string": "1970-01-01T00:00:00.000Z", "key": 0, "doc_count": 26 } 
    ] 
} 

Что я пробовал:

  • уменьшая сценарий inline элемент только return 1. Это все еще приводит к разрыву агрегации
  • возвращениедата самого поля даты. Результаты ClassCastException - результатом должно быть число
  • проверка настроек конфигурации ES. Я включил все для script.engine.groovy.{file|indexed|inline}.{aggs|mapping|search|update|plugin}, также script.inline, script.indexed и script.aggs.
  • Проверен 2.0 breaking aggregation changes, но ничего похожего не было.

Я знаю, что могу запускать отдельные запросы, имеющие этот фильтр в самом запросе (а не в части агрегации), что позволило бы сделать агрегацию без скрипта. Дело в том, что у меня есть дюжина различных агрегатов, которые берут один и тот же набор результатов поиска и выполняют различные типы фильтрации (и агрегации). Выполнение одного и того же запроса несколько раз встречно и неприемлемо.

Насколько я знаю, этот использовал для работы в версии 1.4.4, но больше не работает в версии 2.2.0.

Это ошибка? Или, может быть, одна и та же логика может быть переопределена по-разному, например. через агрегирование скриптов Bucket или любой другой?

ответ

2

Вы пробовали с новой структурой агрегации и встроенными тройниками в стиле строгий стиль?

Я ранее сталкивался с тем же вопросом, и именно так я его решил. Вашей агрегация запрос будет выглядеть следующим образом:

"aggs": { 
"2": { 
    "date_histogram": { 
    "field": "startDate", 
    "interval": "month", 
    }, 
    "aggs": { 
    "1": { 
     "sum": { 
     "script": "((condition) ? 1 : 0)", 
     "lang": "expression" 
     } 
    } 
    } 
} 
} 

Обратите внимание, что вы можете попробовать его с определением скрипта как .groovy файл в папке сценариев установки ElasticSearch.

Надеюсь, что это поможет.

С уважением.

Смежные вопросы