Kibana中的查询不使用Regexp返回日志

问题描述

我在Elasticsearch中有一个名为log.file.path的字段,它的值为/var/log/dev-collateral/uaa.2020-09-26.log,我试图检索所有log.file.path字段以/var/log/dev-collateral/uaa开头的日志 我使用了下面的正则表达式,但是不起作用。

{
    "regexp":{
        "log.file.path": "/var/log/dev-collateral/uaa.*"
    }
}

解决方法

让我们看看为什么它不起作用?我已经使用Kibana UI索引了两个文档,如下所示-

PUT myindex/_doc/1
{
  "log.file.path" : "/var/log/dev-collateral/uaa.2020-09-26.log"
}

PUT myindex/_doc/2
{
  "log.file.path" : "/var/log/dev-collateral/uaa.2020-09-26.txt"
}

当我尝试使用log.file.path API来查看_analyze字段上文本的令牌

POST _analyze
{
  "text": "/var/log/dev-collateral/uaa.2020-09-26.log"
}

它给了我

{
  "tokens" : [
    {
      "token" : "var","start_offset" : 1,"end_offset" : 4,"type" : "<ALPHANUM>","position" : 0
    },{
      "token" : "log","start_offset" : 5,"end_offset" : 8,"position" : 1
    },{
      "token" : "dev","start_offset" : 9,"end_offset" : 12,"position" : 2
    },{
      "token" : "collateral","start_offset" : 13,"end_offset" : 23,"position" : 3
    },{
      "token" : "uaa","start_offset" : 24,"end_offset" : 27,"position" : 4
    },{
      "token" : "2020","start_offset" : 28,"end_offset" : 32,"type" : "<NUM>","position" : 5
    },{
      "token" : "09","start_offset" : 33,"end_offset" : 35,"position" : 6
    },{
      "token" : "26","start_offset" : 36,"end_offset" : 38,"position" : 7
    },"start_offset" : 39,"end_offset" : 42,"position" : 8
    }
  ]
}

您可以看到,当您将输入文本插入到索引中时,Elasticsearch会将输入文本拆分为标记。这是因为当我们为文档建立索引时,elasticsearch使用标准分析器,并且将其作为标记将文档分为小部分,删除标点符号,小写字母等。乳清您当前的正则表达式查询不起作用。

GET myindex/_search
{
  "query": {
    "match": {
      "log.file.path": "var"
    }
  }
}

如果您尝试这种方式将起作用,但是对于您的情况,您需要匹配每个以 .log 结尾的 log.file.path 。那么现在该怎么办?只是在索引文档时不要应用分析器。关键字类型按原样存储您提供的字符串。

使用keyword类型创建映射,

PUT myindex2/
{
  "mappings": {
    "properties": {
      "log.file.path": {
        "type": "keyword"
      }
    }
  }
}

索引文档

PUT myindex2/_doc/1
{
  "log.file.path" : "/var/log/dev-collateral/uaa.2020-09-26.log"
}

PUT myindex2/_doc/2
{
  "log.file.path" : "/var/log/dev-collateral/uaa.2020-09-26.txt"
}

使用regexp 搜索,

GET myindex2/_search
{
  "query": {
    "regexp": {
      "log.file.path": "/var/log/dev-collateral/uaa.2020-09-26.*"
    }
  }
}
,

我使用了这个查询,它有效!

{
  "query": {
    "regexp": {
      "log.file.path.keyword": {
        "value": "/var/log/dev-collateral/uaa.*","flags": "ALL","max_determinized_states": 10000,"rewrite": "constant_score"
      }
    }
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...