Мне нужно исключить из поиска ассоциацию разных терминов. Есть ли какой-нибудь умный способ сделать такое многочленное исключение?
Пример: скажем, я хочу получить всех пользователей, кроме тех, чьи (фамилия Доу) и (имя Джон или Annie или без имени).
Пример ожидаемых результатов:
first_name | last_name | Search result
--------------------------------------
Bob | Doe | appears
--------------------------------------
Annie | Doe | excluded
--------------------------------------
(null) | Doe | excluded
--------------------------------------
John | Foo | appears
--------------------------------------
(null) | Foo | appears
Пока лучшее, что я сделал, это следующий запрос, но он не работает: в нашем примере этот запрос исключит всех, чья фамилия Доу, каким бы ни было имя… и я не могу понять, почему?
GET user/_search
{
"query": {
"bool": {
"must_not": [
{
"bool": {
"must": [
{
"term": {
"last_name": "Doe"
}
}
]
}
},
{
"bool": {
"should": [
{
"bool": {
"must": [
{
"terms": {
"first_name": [
"John",
"Annie"
]
}
}
]
}
},
{
"bool": {
"must_not": {
"exists": {
"field": "first_name"
}
}
}
}
]
}
}
]
}
}
}
Любая помощь Elastic-острого глаза в этом будет высоко оценена!