Фильтр ElasticSearch не работает с must и must_not - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь отфильтровать ошибки в Kibana, но не все ошибки, только ошибки, которые не имеют указанной строки c в поле сообщения. Мой запрос выглядит следующим образом:

GET search-apps/_search
{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "must": [
            {
              "range": {
                "@timestamp": {
                  "gte": "now-120m",
                  "lte": "now"
                }
              }
            },
            {
              "term": {
                "level": "error"
              }
            }
          ],
          "must_not": [
            {
              "term": {
                "message": "Exception thrown while fetching records from Kinesis"
              }
            }
          ]
        }
      }
    }
  }
}

Кажется, что фильтр игнорирует "must_not", так как я все еще получаю ошибки, которые имеют эту строку в поле сообщения. Есть ли какой-то порядок выполнения, когда он игнорирует must_not? Должен работать нормально, я получаю только уровень: ошибка возвращается, но я также получаю результаты, которые имеют эту строку в сообщении. Это также работает, если я хотел вернуть результаты только с полем сообщения:

{
  "query": {
    "match": {
      "message": {
        "query": "Exception thrown while fetching records from Kinesis",
        "type": "phrase"
      }
    }
  }
}

Однако для этой темы, обратное не работает, как предлагалось.

1 Ответ

0 голосов
/ 07 февраля 2020

Ваш вопрос уже содержит решение вашей "проблемы".

В вашем must_not -безисе вы используете term -запрос, который проверяет точное соответствие, тогда как в вашем "тесте" - запрос вы используете phrase -запрос. Если ваше сообщение содержит фразу , а также некоторые дополнительные байты / текст, запрос term больше не соответствует.

Решение Просто замените term на match_phrase в вашем bool -запросе.

...