繁体   English   中英

Java中的Elasticsearch正则表达式查询无法按预期工作

[英]Elasticsearch regex query in java not working as intended

我有一个Java应用程序,可检索存储在ElasticSearch中的日志。 日志的存储方式如下(这是您从ElasticSearch中检索的内容):

 { "took":1013, "timed_out":false, "_shards":{"total":40,"successful":40,"failed":0}, "hits":{"total":28,"max_score":null,"hits": [ { "_shard":"[logstash-2017.09.06][0]", "_node":"_G934CTGTjKypnI_D1b1Lg", "_index":"logstash-2017.09.06", "_type":"logs", "_id":"AV5WyiTlbV8ga6rEI4b8", "_score":null, "_source":{"@timestamp":"2017-09-06T10:44:01.691Z", "@version":"1", "message":"{ \\"log\\":\\"2017-09-19 09:26:09,149 INFO [com.mycompany.class.MyClass] (default task-23) Some log to retrieve\\", \\"stream\\":\\"stderr\\", \\"docker\\":{ \\"container_id\\":\\"61b34e11002c636b289e7c40d6fbc6718e0deec58bf8a3410d598e3bd561672d\\" }, \\"metadata\\":{ \\"container_name\\":\\"router\\", \\"namespace_name\\":\\"default\\", \\"cluster_name\\":\\"cluster\\" } }" }, "sort":[1504694641691] } ] } } 

要仅获取包含例如“ INFO”一词的日志,我想查询“消息”,但该日志在\\“ log \\”内,并且我只想查询\\“ log内的单词\\”。

我以为如果我查询“ message.log”,它可能会工作,但没有。 它不是嵌套的json(“ message”:{key:value,key:value}),而是“ message”:“ {string}”(有双引号):_(

如果日志的存储方式像“ log”:“ The log”一样简单,那么很容易,但是我无法更改将日志放入ElasticSearch的logstash的行为。

因此,我尝试将正则表达式(QueryBuilders.regexpQuery(“ message”,“ Some_regex”))与以下正则表达式一起使用:

.*\"log\\\":\\\".*INFO.*},\\\"metadata\\\":{

我知道此正则表达式也会影响\\“ stream \\”或\\“ docker \\”,但这不是问题。

我在http://regexr.com/https://regex101.com/中测试了此正则表达式,它应该可以工作,但是当我执行查询时,我发现0个结果(应该有结果)。

我通过试错测试了更多的正则表达式,但是如果我在之后添加任何内容,都找不到结果

.*\"log\\\":\\\".*INFO

我不太习惯使用正则表达式,我确实想在没有您帮助的情况下成功完成它,但是现在我有点迷路了...

在此先感谢您,对不起我的英语不好。 谢谢!

是一个正则表达式,用于将INFO部分后的内容分组:

.*\\"log\\":\\".* INFO (.*)

说明:- \\\\是匹配一个反斜杠所必需的-括号(.*)用于分组。 您可以稍后再检索它们。

Java中的用法有些棘手。 即,如果您想将此字符串指定为java String文字,那么您将获得以下信息:

String str = "\"message\":\"{\"\r\n\\\"log\\\":\\\"2017-09-19 09:26:09,149 INFO [com.mycompany.class.MyClass] (default task-23) Some log to retrieve\\\",";

看起来很奇怪,但是您可以随时测试我是否正确地逃脱了它们:

System.out.println(str);

因此,这是在Java中使用此正则表达式的方法:

    // lots of escape characters :(
    // you can reuse the compiled pattern
    Pattern p = Pattern.compile(".*\\\\\\\"log\\\\\\\":\\\\\\\".* INFO (.*)");
    // this is how you match
    Matcher m = p.matcher(str);
    if (m.find()) {
        // this is how you retrieve the text after INFO
        System.out.println(m.group(1));
    } else {
        System.out.println("--> no match");
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM