【问题标题】:Query fields in Kibana with RegEx使用 RegEx 在 Kibana 中查询字段
【发布时间】:2021-03-09 06:56:32
【问题描述】:

我需要在 Kibana 日志中搜索具有特定内容的字段。该字段是“消息”,如下所示:

11.111.72.58 - - [26/Nov/2020:08:44:23 +0000] "GET /images/image.jpg HTTP/1.1" 200 123456 "https://website.com/questionnaire/uuid/结果" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.14 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.14" "5.158.163.231"

此字段包含 URI,例如此处“https://website.com/questionnaire/uuid/result”。如何在该字段中搜索特定 URI? 我需要获取所有日志,其中“消息”字段包含“https://website.com/questionnaire/someUUID*/result” 或者 URI 正好是“https://website.com/”

我已经尝试过 Lucene:

消息:/https://.+/result/

没有找到

消息:https.*\结果

找到开头带有“https:”的URI,但也返回结尾不带“result”的URI

消息:“https://website.com/questionnaire”和消息:“结果”

这行得通,但如果“结果”与 URI 无关,但只会在“消息”字段的末尾单独存在,这也行得通。我需要一些东西,它会真正查询“”之间的那些 URI。 稍后我需要用 Kibana 可视化每个 URI 的请求数量。所以我认为我需要使用 Lucene 或 Query DSL。 有什么想法吗?

【问题讨论】:

    标签: regex elasticsearch lucene kibana


    【解决方案1】:

    这是新的wildcard field type(在 7.9 中引入)的一个很好的用例,它允许您 better search within potentially long strings

    如果您将消息字段声明为wildcard,如下所示:

    PUT test 
    {
      "mappings": {
        "properties": {
          "message": {
            "type": "wildcard"
          }
        }
      }
    }
    

    然后索引您的文档

    PUT test/_doc/1
    {
      "message": """11.111.72.58 - - [26/Nov/2020:08:44:23 +0000] "GET /images/image.jpg HTTP/1.1" 200 123456 "https://website.com/questionnaire/uuid/result" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.14 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.14" "5.158.163.231"
      """
    }
    

    然后您可以运行 wildcard searches(即使使用前导通配符 discouraged 以在普通关键字字段上运行)并轻松找到您的文档。

    GET test/_search
    {
      "query": {
        "wildcard": {
          "message": {
            "value": "*https*uuid*"
          }
        }
      }
    }
    

    【讨论】:

    • 我只能在控制台中使用 DevTools,而不是在 Discover > 搜索:GET _search { "query": { "wildcard": { "message": { "value": "*https://website.com/start*" } } } } 如果我运行它,那么我会得到:{ "took" : 185, "timed_out" : false, "_shards" : { "total" : 79, "successful" : 79, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 0, "relation" : "eq" }, "max_score" : null, "hits" : [ ] } } 我想我无法在仪表板中看到它?
    • 您可以在 Discover 中执行此操作,方法是单击“添加过滤器”(在搜索栏下方),然后单击“编辑为查询 DSL”,最后在文本框中添加查询
    • 有趣,我可以搜索"value": "*https*",但*https*website* 不起作用。我认为因为 * 表示零个或多个“s”字符。但是带有点(任何字符)的*https.*website* 也不起作用。
    • 不鼓励在 keyword 字段上使用前导通配符运行通配符搜索。性能方面,它可能会损害您的集群,但这当然取决于它的大小。
    • 这很奇怪,"value": "s?*o?t" 适用于 "stream"-field => 这将返回所有 "stdout" 值。但同样的“消息”字段不起作用:“https?*start”=>“没有结果符合您的搜索条件”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多