在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 ---没有电子邮件与白名单匹配的文档。
是否有一种有效的方法来实现这一目标?不幸的是,有太多数据无法使用脚本查询。