KQL-запрос для поиска по нескольким полям в Kibana

#elasticsearch #kibana

#elasticsearch #kibana

Вопрос:

Я создал этот KQL, который работает нормально, я ищу строку error в message поле, и одно и то же поле не должно содержать EOF . Здесь я использовал must и must not. Теперь я хочу добавить дополнительное условие (И), где поле (kubernetes.pod.name ) содержит test .

 {
      "size": 1,
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "message": {
                  "query": "error",
                  "operator": "OR",
                  "prefix_length": 0,
                  "max_expansions": 50,
                  "fuzzy_transpositions": true,
                  "lenient": false,
                  "zero_terms_query": "NONE",
                  "auto_generate_synonyms_phrase_query": true,
                  "boost": 1
                }
              }
            },
            {
              "range": {
                "@timestamp": {
                  "from": "now-10000m",
                  "to": null,
                  "include_lower": true,
                  "include_upper": true,
                  "boost": 1
                }
              }
            }
          ],
          "must_not": [
            {
              "match_phrase": {
                "message": {
                  "query": "EOF",
                  "slop": 0,
                  "zero_terms_query": "NONE",
                  "boost": 1
                }
              }
            }
          ],
          "adjust_pure_negative": true,
          "boost": 1
        }
      },
      "sort": [
        {
          "@timestamp": {
            "order": "desc"
          }
        }
      ]
    }
 

Комментарии:

1. Кстати, KQL — это сокращение от Kibana Query Language , и то, что вы получили выше, — это запрос DSL (язык, специфичный для домена), а не KQL 🙂

Ответ №1:

Просто расширьте must массив match запросом, чтобы применить еще один логический И:

 {
  "size": 1,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "kubernetes.pod.name": "test"       <--
          }
        },
        {
          "match": {
            "message": {
              "query": "error",
              ...
            }
          }
        },
        {
          "range": {
            "@timestamp": {
              ...
            }
          }
        }
      ],
      "must_not": [
        {
          "match_phrase": {
            "message": {
              "query": "EOF",
              ...
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  ...
}
 

Комментарии:

1. Я пробовал это, но это не работает. Когда я удалил недавно добавленный блок. Я вижу журналы с kubernetes.pod.name : тест-XXXXX. Также, когда я заменяю значение в новом блоке с test на test-XXXXX. Я вижу журналы. Так что, я думаю, это не проверка содержимого, а точная строка

2. Каково отображение этого поля?

3. «сопоставления»: { «kubernetes.pod.name » : { «полное имя_имя» : «kubernetes.pod.name «, «сопоставление» : { «имя» : { «тип»: «ключевое слово», «ignore_above» : 1024 } } } }

4. Спасибо — да, я так и думал — сопоставление ключевых слов поддерживает только полные и точные совпадения. У вас есть 2 варианта: переиндексировать все как text keyword в виде нескольких полей или использовать prefix запрос или даже regexp запрос.

5. Я использовал регулярное выражение, но оно не работает. Как я могу переиндексировать?