У нас есть лог в котором встречается массив объектов, естественно мы используем nested type и всё прекрасно работает.
Но возникла необходимость создать такой запрос:
найти все записи лога, в каждой из которых поле exists для всех элементов массива.
На данный момент exists выдаёт запись лога если хотя бы в одном элементе массива exists поле.
Насколько я понимаю это возможно найти только скриптом?
Скриптом это сделать можно, но на большом объеме данных скрипт будет работать очень медленно. Для такого рода задач часто работает трюк, который я называю "двойным отрицанием". Работает этот трюк так. Если предположить, что во всех записях есть хотя бы один элемент массива, то "все записи лога, в каждой из которых поле exists для всех элементов массива" это тоже самое что "все записи лога, кроме записей в которых хотя бы в одном элементе массива отсутствует поле"
Другими словами, начинаем с вашим текущим запросом, который "выдаёт все записи лога, у которых хотя бы в одном элементе массива exists поле." Теперь, внутри nested заворачиваем exists в must_not это нам дает "все записи лога, в которых хотя бы в одном элементе массива отсутствует поле". Теперь заворачиваем весь запрос в must_not и получаем "все записи в которых все элементы массива присутствуют или массив пуст". С записями с пустыми массивами можно разобраться добавив еще один запрос во внешний bool.
Apache, Apache Lucene, Apache Hadoop, Hadoop, HDFS and the yellow elephant
logo are trademarks of the
Apache Software Foundation
in the United States and/or other countries.