2016-02-17 3 views
0

Я пытаюсь создать собственную скриптовую агрегирование в Elasticsearch с использованием языка скриптов по умолчанию Groovy.Elasticearch & Groovy Scripting Вложенное полевое агрегирование Соответствие

Мои данные, установленные в elasticsearch является:

"days_open": [ 
{ 
"open": "0800", 
"close": "2200", 
"dotw": "monday" 
} 
, 
{ 
"open": "0800", 
"close": "2300", 
"dotw": "tuesday" 
} 
, 
{ 
"open": "0800", 
"close": "2200", 
"dotw": "wednesday" 
} 
, 
{ 
"open": "0800", 
"close": "2300", 
"dotw": "thursday" 
} 
, 
{ 
"open": "0800", 
"close": "2300", 
"dotw": "friday" 
} 
, 
{ 
"open": "0800", 
"close": "1700", 
"dotw": "saturday" 
} 
] 

Я хочу сделать агрегацию «Open Now», который будет отображать все busnesses с этим вложенными данными, как «открыть».

"open_now": { 
    "filter": { 
    "script": { 
     "script": { 
     "inline": "days_open = _source.days_open; days_open.each {day-> if (day.dotw == 'wednesday' && day.open < 1200 && day.close > 1200) { return true; }}; return false;" 
     } 
    } 
    } 
} 

Однако я получаю сообщение об ошибке, как это:

"reason": { 
    "type": "script_exception", 
    "reason": "failed to run inline script [days_open = _source.days_open; days_open.each {day-> if (day.dotw == 'wednesday' && day.open < 1200 && day.close > 1200) { return true; }}; return false;] using lang [groovy]", 
    "caused_by": { 
     "type": "no_class_def_found_error", 
     "reason": "sun/reflect/MethodAccessorImpl", 
      "caused_by": { 
       "type": "class_not_found_exception", 
       "reason": "sun.reflect.MethodAccessorImpl" 
      } 
     } 
     } 

кажется, что days_open значение переменной заключается в следующем: [{dotw=monday, close=2200, open=0800}, {dotw=tuesday, close=2300, open=0800}, {dotw=wednesday, close=2200, open=0800}, {dotw=thursday, close=2300, open=0800}, {dotw=friday, close=2300, open=0800}, {dotw=saturday, close=1700, open=0800}], который я могу получить от _head плагина в Elasticsearch, используя собственные запросы, но я не знаю, как получить отладочную информацию дальше, чем от Groovy в интерфейсе.

Я использую пакет ONGR Elasticsearch https://github.com/ongr-io/ElasticsearchDSL, который, как представляется, имеет ошибку в настоящее время вложенных Aggs (он окружает вещи дважды дублирующими ключами), но установка сырых вложенных aggs на самом деле не дает мне результатов, которые я ищу в любом случае , Я ищу единичные результаты, которые выглядят так:

"open_now": { 
    "doc_count": 5 
}, 

Что бы перевести «5 бизнеса в настоящее время открыт (из 20)», не ведер. Сценарий казался лучшим вариантом здесь, подскажите мне, если я ошибаюсь, или если я что-то упустил!

В принципе мне нужен сценарий или agg в ElasticsearchDSL, который может дать мне результат, который я ищу. В настоящее время у меня есть другие агги, которые отлично работают на отдельных полях, таких как «has_website», если поле «business.website» истинно, но поскольку для этого требуется небольшая логика определения «открыть сейчас», я не уверен, как идти об этом в порядке, который работает.

ответ

0

Забавно, как вы всегда находите решение через 4 часа и обращаетесь за помощью.

мне удалось правильно сделать работу запросов с помощью Стиль Java for заявления: Отлич- Запрос:

days_open = _source.days_open; 
for (day in days_open) { 
    if (day.dotw == 'wednesday' && day.open < '1200' && day.close > '1200') { 
     return true; 
    } 
}; 
return false; 

ElasticsearchDSL Код:

//OPEN NOW 
    $now = new \DateTime("NOW"); 
    $day = strtolower($now->format('l')); 
    $time = $now->format('Hi'); 

    $openNowAgg = new \ONGR\ElasticsearchDSL\Aggregation\FilterAggregation('open_now'); 
    $openScript = new \ONGR\ElasticsearchDSL\Query\ScriptQuery("days_open = _source.days_open; for (day in days_open) { if (day.dotw == '{$day}' && day.open < '{$time}' && day.close > '{$time}') { return true; }}; return false;"); 
    $openNowAgg->setFilter($openScript); 
    $search->addAggregation($openNowAgg); 
Смежные вопросы