У нас есть мультитенантный индекс, и нам нужно выполнять запросы к индексу только для одного арендатора. По сути, для всех документов, которые соответствуют фильтру, возвращаются все документы, которые соответствуют следующему запросу, но не включают документы, которые соответствуют только фильтру.
Например, скажем, у нас есть список документов документа, например, так:
{ _id: 1, account_id: 1, name: "Foo" }
{ _id: 2, account_id: 2, name: "Bar" }
{ _id: 3, account_id: 2, name: "Foo" }
Я думал, что этот запрос будет работать, но это не так:
{
"bool": {
"filter": { "term": { "account_id": 2 } },
"should": [
{ "match": { "name": "Foo" }
]
}
}
Возвращает оба документа, соответствующие account_id: 2
:
{ _id: 3, account_id: 2, name: "Foo", score: 1.111 }
{ _id: 2, account_id: 2, name: "Bar", score: 0.0 }
Что я действительно хочу, так это просто вернуть документ _id: 3
, который, по сути, «из всех документов, где account_id равен 2, возвращает только те, чьи имена соответствуют Foo».
Как я могу сделать это с ES 6.2? Предостережение заключается в том, что число условий совпадения should
и must
не всегда известно, и я действительно хочу избегать использования minimum_should_match
.