2017-09-19 35 views
2

我有一個Java應用程序,用於檢索存儲在ElasticSearch中的日誌。 日誌存儲像這樣(這是你從ElasticSearch檢索什麼):Elasticsearch在java中的正則表達式查詢不按預期工作

{ 
 
\t "took":1013, 
 
\t "timed_out":false, 
 
\t "_shards":{"total":40,"successful":40,"failed":0}, 
 
\t "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] 
 
     } 
 
    ] 
 
    } 
 
}

獲取包含,例如僅日誌,單詞「信息」,我要查詢「消息」,但日誌在「日誌」內,我只想查詢「日誌」內部的單詞。

我想也許如果我查詢「message.log」它可以工作,但它沒有。它不是嵌套的json(「message」:{key:value,key:value}),它是「message」:「{string}」(有雙引號):_(

這很容易如果日誌存儲爲「日誌」:「日誌」沒有別的,但我不能改變將日誌放入ElasticSearch的logstash的行爲。所以我嘗試使用正則表達式(QueryBuilder。 regexpQuery(「信息」,「Some_regex」))具有以下的正則表達式:

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

我知道,這個正則表達式也會影響\「流\」或\「泊塢窗\」,但它不是一個問題

我測試了這個正則表達式在http://regexr.com/https://regex101.com/它應該工作,但是當我做查詢時,我發現0結果(並且應該有結果)。

我試錯測試了正則表達式,但如果我以後

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

我不是很習慣正則表達式添加任何東西都沒有發現的結果,我也想成功地完成它沒有你幫助,但我現在有點失落...

謝謝你提前,並抱歉我的英語不好。謝謝!

回答

0

Here是一個正則表達式來組INFO部分後的東西:

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

說明: - \\需要匹配的一個反斜槓 - 括號(.*)是用於分組。您可以稍後檢索它們。

java中的用法有點棘手。即如果你想指定字面這個字符串作爲Java字符串,那麼你將會得到:

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"); 
    } 
+0

我感謝你的幫助,但它不是Java誰需要使用這個表達式(用圖案和匹配器),它elasticsearch使用regexpQuery的。在正則表達式工作的java中,但是當我使用它反對elasticsearch時,它不會,查詢不會受到該正則表達式的任何'命中'。 –

+0

正則表達式也使用'javascript'方言。你可以試試嗎? –

相關問題