使用通配符过滤掉记录

时间:2017-11-29 12:57:39

标签: elasticsearch kibana

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

我尝试了一些其他组合,但我无法让它发挥作用。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

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

在对数据进行索引并将其拆分为更好的可搜索部分之前,最好分析一下数据。

答案 1 :(得分:0)

这听起来很奇怪,但由于大写文字,似乎无法正常工作。

试试这个:

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

答案 2 :(得分:0)

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

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

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

情况2: 不区分大小写的搜索,在字符串中包含单词 http_host

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