我正在尝试解析包含XML的Elasticsearch字符串字段(名为Request.Body
)。该字段包含SOAP请求字符串,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="myURL">
<SOAP-ENV:Body>
<ns1:find>
<token>myData</token>
<login>myData</login>
<language>myData</language>
<search>myData</search>
<contains>false</contains>
</ns1:find>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我的目标是使用无痛语言在脚本字段(在Kibana中)中提取search
标记的值。
我试过了:
def field = doc['Request.Body'].value;
if (field != null) {
def matcher = /<search>(.*)<\/search>/.matcher(field);
if (matcher.find()) {
return matcher.group(1);
}
return "No match";
}
return "No field";
此代码始终返回No match
。
要进行调试,我尝试返回doc['Request.Body'].value
的值,在此示例中,它仅返回1.0
而不是我的完整XML。
我还尝试使用该代码连接此对象中values
列表的值:
def field = doc['Request.Body'].getValues().stream().collect(Collectors.joining(""));
if (field != null) {
def matcher = /<search>(.*)<\/search>/.matcher(field);
if (matcher.find()) {
return matcher.group(1);
}
return "No match";
}
return "No field";
现在,field
变量等于包含XML标记值,但是我丢失了XML标记,所以我无法使用正则表达式提取数据,就像第一个脚本一样,它总是返回{ {1}}。
所以我的问题是,如何在我的脚本中的变量中获取我的字段的完整XML值?为什么Elasticsearch正在“解析”我的XML?
任何帮助将不胜感激。感谢。
答案 0 :(得分:1)
这是一个老话题,但遇到了同样的问题。我能够以这种方式使用字段定义来解决它:
def field = params._source.Request.Body;
这段代码可以从sting字段中提取相关信息:
def field = params._source.message;
if (field != null) {
def matcher = /<decisionText>(.*)<\/decisionText>/.matcher(field);
if (matcher.find()) {
return matcher.group(1);
}
return "No match";
}
return "No field";
就我而言,数据位于“消息”字段中