painless 简介
- painless 是ES提供的一中脚本语言,语法和javascript/groovy类似,支持Java的基本类
应用
- 需要某个字段做切分,例如按照空格space,点号dot切分
使用手册
https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-api-reference-field.html
- 官方文档貌似对split没有过多的介绍和示例
https://discuss.elastic.co/t/can-we-use-split-processor-with-painless-scripting/98536
- 在ES官方讨论区找到如下内容
String[] parts = /_/.split(request)
String.split is not available because it compiles a regex. In Painless, regexes are a feature that can be disabled, and also statically compiled (thus the special syntax using the "slashy string" to get a Pattern object above.
实践
- 对某个字段做点号分隔,添加到新的字段上
POST /daily_quotes/_update_by_query?conflicts=proceed
{
"script": {
"source": "String s = ctx._source['tsCode'];String[] array = /\\./.split(s);ctx._source.code_a = array[0];ctx._source.region = array[1]",
"lang": "painless"
}
}
- 做空格分隔时
POST /daily_quotes/_update_by_query?conflicts=proceed
{
"script": {
"source": "String s = ctx._source['tsCode'];String[] array = / /.split(s);ctx._source.code_a = array[0];ctx._source.region = array[1]",
"lang": "painless"
}
}
- 切分分为两个,一中属于特殊字符,一种不属于特殊字符,带特殊加两个反斜杠
如何验证脚本
- 参考文档
- 参考示例
POST /_scripts/painless/_execute
{
"script": {
"source": "String[] array = /\\./.split(params.count); return array.length",
"params": {
"count": "123.SH",
"total": 1000.0
}
}
}