【问题标题】:KQL query to search in multiple fields in Kibana在 Kibana 中搜索多个字段的 KQL 查询
【发布时间】:2020-12-12 05:07:34
【问题描述】:

我创建了这个运行良好的 KQL,我正在 message 字段中搜索字符串 error,并且同一字段不应包含 EOF。在这里,我使用了 must 和 must not。现在我想添加一个额外的条件(AND),其中一个字段(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"
          }
        }
      ]
    }

【问题讨论】:

  • 顺便说一句,KQL 是 Kibana Query Language 的缩写,而您上面得到的是 DSL(域特定语言)查询,而不是 KQL :)

标签: elasticsearch kibana


【解决方案1】:

只需使用match 查询扩展must 数组以应用更多逻辑与:

{
  "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
    }
  },
  ...
}

【讨论】:

  • 我试过了,但它不起作用。当我删除新添加的块时。我看到带有 kubernetes.pod.name: test-XXXXX 的日志。此外,当我将新块中的值从 test 替换为 test-XXXXX 时。我看到了日志。所以我猜它不是检查包含而是确切的字符串
  • 那个字段的映射是什么?
  • "mappings" : { "kubernetes.pod.name" : { "full_name" : "kubernetes.pod.name", "mapping" : { "name" : { "type" : "keyword ", "ignore_above" : 1024 } } } }
  • 谢谢——是的,我就是这么想的——关键字映射只支持完全、完全匹配。您有 2 个选项:将所有内容重新索引为 text + keyword 作为 multi-field 或使用 prefix query 甚至是 regexp 查询。
  • 我使用了正则表达式,但它不起作用。我如何重新索引?
猜你喜欢
  • 2020-09-03
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多