В ElasticSearch (5.4) у меня есть документы следующей структуры:
{
"email": {
type: "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
, где email
- многозначное поле (с любым документом может быть связано несколько электронных писем), представляющее адрес электронной почты. У меня также есть список «разрешенных адресов электронной почты».
Я хотел бы написать запрос, чтобы найти документы, содержащие любые адреса электронной почты вне белого списка.
Например, если бы у нас было:
whitelist = ['email1@test.com', 'email2@test.com']
document1: {email: ['email1@test.com', 'email4@test.com']}
document2: {email: ['email1@test.com']}
document3: {email: ['email5@test.com', 'email6@test.com']}
Мы бы хотели, чтобы запрос нашел документы 1 и 3.
Моим первым инстинктом было использование запроса вида:
{
bool: {
must_not: {terms: {email.keyword: [whitelist]}}}
}
}
Однако это возвращает только document3 --- документ, в котором ни один из электронных писем не соответствует белому списку.
Есть ли эффективный способ добиться этого? К сожалению, слишком много данных, чтобы использовать запрос сценария.