Elasticsearch соответствует только фильтру - PullRequest
0 голосов
/ 03 января 2019

У нас есть мультитенантный индекс, и нам нужно выполнять запросы к индексу только для одного арендатора. По сути, для всех документов, которые соответствуют фильтру, возвращаются все документы, которые соответствуют следующему запросу, но не включают документы, которые соответствуют только фильтру.

Например, скажем, у нас есть список документов документа, например, так:

{ _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.

1 Ответ

0 голосов
/ 03 января 2019

Попробуйте вместо этого: просто замените should на must:

{
  "bool": {
    "filter": { "term": { "account_id": 2 } },
    "must": [
      { "match": { "name": "Foo" }
    ]
  }
}
...