ES的script field

358 阅读1分钟

Dev Tools编写脚本

在Kiabna界面,选择Dev Tools

image.png

可以进入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 '其他含义';
          }
        """
      }
    }
  }
}

可以得到正确结果如下:

image.png

Kibana的Index Pattern

选中对应的Index Patterns

image.png 点击 Scripted fields,并选择 Add scripted field

image.png

if (doc['error_code'].size() == 0) {
	return '成功';
}
def errorCode = doc['error_code'].value;
if (errorCode == 1005) {
	return '无填充';
} else {
	return '其他含义';
}

编写完后可以先预览Check

image.png

image.png 最后在Discover便可以看到如下结果

image.png

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 '其他';
}

image.png

个人建议使用第一种判断数组的方法,方便更简洁。

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;
  
        """
			}
		}
	}
}

参考:

在elasticsearch中简单的使用script_fields