2016-06-02 1 views
1

У меня есть документ, который имеет createdDate и closedDate. Теперь я хочу найти все документы, где (closedDate - createdDate) > 2. Я не могу применять скрипт в поле диапазона. Любой подскажите, как это сделать. Я думаю, что это может быть возможно с помощью скриптов. Я никак не могу выполнить это по запросу.Запрос, который работает на разницу дат

Разве это не способ выполнить это, как

{ 
    "range" : { 
     "date" : { 
      "gt" : "{createdDate} - {closedDate}/d > 2" 
     } 
    } 
} 

ответ

1

Единственный способ сделать это с помощью запроса индексировать Additonal длительность поля до рук в вашем JSON документа. Лично я буду хранить продолжительность в миллисекундах и использовать фильтры для запросов.

Если это неприемлемо, вам придется использовать поля сценария. Описаны here и here в документе Elasticsearch.

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

+0

Я думал об этом –

1

Да, вы можете сделать это с помощью сценария

{ 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "script": { 
      "script": "(doc.closedDate.value - doc.createdDate.value)/86400000 > 2" 
      } 
     } 
     ] 
    } 
    } 
} 

Примечание: убедитесь, что enable dynamic scripting для того, чтобы попробовать это.

Однако было бы лучше уже вычислить эту разницу во время индексации, а затем использовать запрос диапазона в этом поле разности.

+0

Спасибо. Я думаю о хранении поля при индексировании –

+1

Было бы лучше, действительно. Все, что вам нужно во время поиска, и вы знаете, что можете рассчитывать при индексировании, вы должны это сделать. – Val

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