Боюсь, что это невозможно, поскольку Elasticsearch хранит данные в инвертированных индексах , структуре данных, которая может ответить на вопрос «какие документы имеют определенный токен», а не «какие документы не имеют»есть другие токены ".
Есть несколько вещей, которые вы можете попробовать.
Укажите соответствие tags
явно
Это можно сделать, если набор всех возможных tags
известно заранее, и количество элементов в поле (== число уникальных тегов) не слишком велико (скажем, меньше 1000).
Если набор возможных значений неизвестен, онможно получить с помощью агрегации terms
.В этом случае вам придется выполнить 2 запроса вместо 1.
В примере из вашего вопроса это будет означать запрос всех документов с тегами в ["a", "e"]
.
Использование script
query
script
запрос по сути является запросом full-scan и позволяет пользователю определять критерии совпадения / несоответствия по своему усмотрению.Основным недостатком является производительность, поскольку Elasticsearch не сможет использовать ни один из своих инвертированных индексов, ему, по сути, придется сканировать все документы.
Этот параметр может оказаться полезным в некоторых обстоятельствах, например, для выполненияпроанализировать или доказать некоторую гипотезу.
Изменить данные
Поскольку универсальный подход неосуществим, может оказаться, что ваше экономическое обоснование на самом деле не является универсальным.Посмотрите на запросы, которые вам нужно выполнить, и оптимизируйте их под ваши сценарии использования.
Например, если вы ищете "любые теги , но b, c, d"- это повторяющийся вариант использования, определите флагоподобное поле "contains_not_b_c_d"
и предварительно рассчитайте его.
Мне бы очень хотелось придумать что-то более позитивное в этом ответе, но этот вариант использованияне там, где процветает Elasticsearch.
Надеюсь, это поможет!