我使用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"
}
}
}
}
我尝试了一些其他组合,但我无法让它发挥作用。有什么想法吗?
答案 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"
}
}
}