问题描述
我在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"
}
}
}
}