我正在尝试使用像这样的内联脚本在'ip'类型的字段上执行术语汇总:
{
"aggs": {
"by_ipaddress": {
"terms": {
"script": {
"inline": "doc['ipAddressFrom'].value",
"lang": "painless"
}
}
}
}
}
它引发以下异常:
"reason": {
"type": "script_exception",
"reason": "runtime error",
"caused_by": {
"type": "array_index_out_of_bounds_exception",
"reason": "16"
},
"script_stack": [
"org.apache.lucene.util.UnicodeUtil.UTF8toUTF16(UnicodeUtil.java:602)",
"org.apache.lucene.util.BytesRef.utf8ToString(BytesRef.java:152)",
"org.elasticsearch.index.fielddata.ScriptDocValues$Strings.getValue(ScriptDocValues.java:83)",
"doc['ipAddressFrom'].value",
" ^---- HERE"
],
"script": "doc['ipAddressFrom'].value",
"lang": "painless"
}
但是当我汇总同一字段时:
{
"aggs": {
"by_ipaddress": {
"terms": {
"field": "ipAddressFrom"
}
}
}
}
有效。
“ ipAddressFrom”字段的映射为:
"ipAddressFrom" : {
"type" : "ip"
}
请让我知道如何在脚本中使用ip字段。
答案 0 :(得分:1)
对于Elasticsearch 6.x,在无痛脚本中使用ip
类型没有任何问题。
您与inline
的聚合不起作用,因为对于某些文档字段ipAddressFrom
不存在。
您可以使用以下方法修复聚合:
"script": {
"inline": "if (doc.containsKey('ipAddressFrom') && !doc['ipAddressFrom'].empty){ return doc['ipAddressFrom'].value} else {return '0'}",
"lang": "painless"
}