[英]Elasticsearch: ingest node - use script processor to populate index fields
[英]Elasticsearch ingest pipeline script processor fails to cast
我正在尝试重新索引数据并根据源文档中的字段进行一些计算。 我已经使用摄取管道来丰富带有 geo_point 的文档,并且还想计算一些其他值。
我遇到的问题是源数据抛出一个错误,说它不能被投射。 这里的细节:
原始(来自 ML csv 输入):
"_source": {
"Time": "18.06.2017 17:37:32",
"Weight (kg)": 286000,
"People": 2,
"Seats": "2"}
但是,使用 ML 完成的导入明确说明了以下内容:
{
"convert": {
"field": "Seats",
"type": "long",
"ignore_missing": true
}
},{
"convert": {
"field": "People",
"type": "long",
"ignore_missing": true
}
}
传入的原始数据是一致的,所有值都是严格的数字,没有引号等(前 3 个是重量、座位和人:
66990;189;172;0;0;0;0;0
为了澄清还有索引的映射/映射模板,稍后它也显示了正确的类型:
"People": {
"type": "long"
},
"Seats": {
"type": "long"
},
现在,当我使用 Kibana 脚本化字段时,我可以计算如下:
if (doc['Seats'].value == 0)
{ return 0 } else
{
long utilization = (doc["People"].value * 100)/doc["Seats"].value;
return utilization
}
一切正常,我得到了计算的利用率。
当我尝试对摄取管道中的脚本执行相同操作时,如下所示:
"caused_by" : {
"type" : "class_cast_exception",
"reason" : "cannot explicitly cast float [java.lang.String] to byte"
}
我使用的代码如下:
"script": {
"if": "!(ctx.Seats=0) && !(ctx.Seats==null)",
"lang": "painless",
"source": "ctx.utilization = (float)ctx.People*100.0/(float)ctx.Seats"
}
我的问题是:
感谢您的帮助和提示。
千比助
在摄取管道中, ctx.Seats
仍然是一个字符串,因为它是源文档中的一个字符串。 您需要在脚本中解析它或在脚本之前转换它。
选项无需转换,只需解析脚本中的值:
"script": {
"if": "!(ctx.Seats=="0") && !(ctx.Seats==null)",
"lang": "painless",
"source": "ctx.utilization = 100.0 * ctx.People / Float.parseFloat(ctx.Seats)"
}
运行脚本前的转换选项:
{
"convert" : {
"field" : "Seats",
"type": "float",
"ignore_missing": true
}
},
{
"script": {
"if": "!(ctx.Seats==0) && !(ctx.Seats==null)",
"lang": "painless",
"source": "ctx.utilization = 100.0 * ctx.People / ctx.Seats"
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.