Как отмечено в вопросе, это первоначальная попытка, которая, кажется, работает, но кажется излишне многословной.
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"exists": {
"field": "A"
}
},
{
"bool": {
"must_not": [
{
"exists": {
"field": "B"
}
}
]
}
}
]
}
},
{
"bool": {
"must": [
{
"exists": {
"field": "C"
}
},
{
"bool": {
"must_not": [
{
"exists": {
"field": "D"
}
}
]
}
}
]
}
}
]
}
}
}