Dev Tools编写脚本
在Kiabna界面,选择Dev Tools
可以进入Console页面,根据目标索引可以在 source 里编写对应的 painless脚本。
例如:
GET test/_search
{
"query": {
"match_all": {}
},
"script_fields": {
"errorCodeDescription": {
"script": {
"source": """
if (doc['error_code'].size() ==0) {
return '成功';
}
def errorCode = doc['error_code'].value;
if (errorCode == 1005) {
return '无填充';
} else {
return '其他含义';
}
"""
}
}
}
}
可以得到正确结果如下:
Kibana的Index Pattern
选中对应的Index Patterns
点击
Scripted fields,并选择 Add scripted field
if (doc['error_code'].size() == 0) {
return '成功';
}
def errorCode = doc['error_code'].value;
if (errorCode == 1005) {
return '无填充';
} else {
return '其他含义';
}
编写完后可以先预览Check下
最后在
Discover便可以看到如下结果
Tips: 当类型为Number时默认解析出来的数据为 数组类型,若没有处理数组大小的时候无法直接用 doc['error_code'].value,需要写成以下方式
def errorCode = doc['error_code'].toString();
if (errorCode == "[1005]") {
return '无填充';
} else if (errorCode == "[1016]") {
return '超时';
} else if (errorCode == "[1010]") {
return '预算方出价太低';
} else {
return '其他';
}
个人建议使用第一种判断数组的方法,方便更简洁。
if语句优化
多个if条件时可考虑使用map
GET test/_search
{
"query": {
"match_all": {}
},
"script_fields": {
"errorCodeDescription": {
"script": {
"source": """
// 检查 error_code 是否为空
if (doc['error_code'].size() == 0) {
return '成功';
}
// 获取 error_code 的值
def errorCode = doc['error_code'].value;
// 使用映射表查找描述
def errorCodesMap = [
1000L: "协议异常",
1001L: "this is 1001 ",
1002L: "this is 1002 "
];
def description = errorCodesMap.containsKey(errorCode) ? errorCodesMap[errorCode] : '其他含义';
return description;
"""
}
}
}
}