使用通配符过滤掉记录

Filter out records with a wildcard

我正在使用 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"
      }
    }
  }
}

我尝试了更多的组合,但无法正常工作。有什么想法吗?

这听起来很奇怪,但由于大写文本,它似乎不起作用。

试试这个:

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

另一种可能性是像这样使用 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"}
    }
  }
}

在为数据编制索引并将其拆分为更易于搜索的部分之前,最好先分析数据。

点击添加过滤器然后点击对话框右上角的编辑为查询DSL:

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

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

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

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