【问题标题】:Filter out records with a wildcard过滤掉带有通配符的记录
【发布时间】:2020-10-30 00:35:13
【问题描述】:

我正在使用 ElasticSearch + Kibana 来记录错误。在 Kibana 仪表板中,我可以通过单击带有减号的放大镜按某个字段过滤掉记录。然后它会生成以下查询以排除:

{
  "query": {
    "match": {
      "message": {
        "query": "Invalid HTTP_HOST header: '12.34.567.89'. You may need to add '12.34.567.89' to ALLOWED_HOSTS.",
        "type": "phrase"
      }
    }
  }
}

现在我想为所有可能的 IP 地址排除这些记录,所以我需要一个通配符(或正则表达式)。我找到了有关通配符和正则表达式here 的文档。但是,它们与上面使用的语法不同。

如果我将上面的查询更改为文档中的查询,它根本不会过滤它。示例:

{
  "query": {
    "wildcard": {
      "message": "Invalid HTTP_HOST header: *"
    }
  }
}

如果我尝试组合它们,我会收到解析错误:Discover: [parsing_exception] [match] unknown token [START_OBJECT] after [query], with { line=1 col=444 }。示例:

{
  "query": {
    "match": {
      "message": {
        "query": {
          "wildcard": {
            "message": "Invalid HTTP_HOST header: *"
          }
        },
        "type": "phrase"
      }
    }
  }
}

我尝试了更多组合,但我无法让它发挥作用。有什么想法吗?

【问题讨论】:

  • 您的message 字段是否有.keyword 子字段?

标签: elasticsearch kibana


【解决方案1】:

另一种可能性是使用regexp query,就像这样,但取决于你有多少数据,这将是 CPU 密集型的:

POST _search
{
  "query": {
    "regexp": {
      "message.keyword": {"value":"Invalid HTTP_HOST header: '<1-999>\\.<1-999>\\.<1-999>\\.<1-999>'\\. You may need to add '<1-999>\\.<1-999>\\.<1-999>\\.<1-999>' to ALLOWED_HOSTS\\.",
      "flags": "ALL"}
    }
  }
}

您最好先分析您的数据,然后再将其编入索引并将其拆分为更好的可搜索部分。

【讨论】:

  • 谢谢!我之前尝试过正则表达式,但无法正确使用语法。可能我错过了那个关键字flags。我现在将其稍微更改为{ "query": { "regexp": { "message.keyword": { "value": "Invalid HTTP_HOST header: '.*'. You may need to add '.*' to ALLOWED_HOSTS\\.", "flags": "ALL" } } } },因为并非所有传入的主机都遵循完全相同的模式,但这是可行的。 :-)
  • 我“只有”每天在日志中有几十个错误(所以每个索引),所以这个正则表达式查询不应该太重。不过感谢您的警告!
  • 不要忘记在第一个 IP 地址后转义点
  • 为什么有必要这样做?点不是 JSON 中的保留字符,这就是为什么你必须转义斜杠,对吧?
  • 点是正则表达式语言中的保留字符。查看ALLOWED_HOSTS 之后的那个
【解决方案2】:

这听起来很奇怪,但似乎因为大写文本而无法正常工作。

试试这个:

{
"query": {
    "wildcard": {
        "message": "*http_host*" 
    }
}

【讨论】:

  • 感谢您的回答!不幸的是,使用这种方法仍然没有过滤掉结果,也没有过滤掉?nvalid * header*
【解决方案3】:

点击添加过滤器,然后点击对话框右上角的Edit as Query DSL

案例 1: 在字符串中包含单词 http_host 的区分大小写的搜索。 通配符支持?或 * 仅限正则表达式功能。

{
   "wildcard": {
      "message.keyword": "*http_host*"
   }
}

案例 2: 在字符串中包含单词 http_host 的不区分大小写的搜索。

{
  "query": {
     "multi_match": {
        "query": "http_host",
        "fields": [
           "message"  
        ],
        "type": "best_fields"
     }
 }
}

【讨论】:

    猜你喜欢
    • 2016-05-13
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多