官方文档页面:https://www.elastic.co/guide/en/elasticsearch/painless/7.12/
- 使用script生成新的字段
{
"script_fields": {
"statistics_day": {
"script": {
"lang": "painless",
"source": """
if (doc['crawl_time'].size()!=0){doc['crawl_time'].value.minusDays(1).toLocalDate().toString()}
"""
}
}
},
"query": {
"term": {
"fans_id": "899080114508402688"
}
}
}
- 使用script更新字段
// 单行脚本
// 如果create_time 不为空,就截取create_time的年月日并减一天赋值给stats_day
{
"script": "if (ctx._source.create_time != null){ctx._source.stats_day=LocalDate.parse(ctx._source.create_time.substring(0,10)).minusDays(1).toString()} "
}
// 多行脚本
// 对匹配query的结果的create_time更新
{
"script": """
def a = ctx._source.create_time.replace("T"," ").substring(0,19);
def f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
ctx._source.create_time=LocalDateTime.parse(a,f).plusDays(1).format(f)
""",
"query": {
"range": {
"ctime": {
"gte": "2021-02-26 00:00:00",
"lte": "2021-02-27 00:00:00"
}
}
}
}
- 复杂一点的脚本
GET /data/_update_by_query
{
"script": """
// 如果user是ArrayList对象并且不为空,并且user[0]中的id的值也是数组类型,就把id的值更新为原值的第一个元素
// 如果user是HashMap对象并且不为空,并且user[0]中的id的值也是数组类型,同样把id的值更新为原值的第一个元素
if (ctx._source.user instanceof java.util.ArrayList && !ctx._source.user.isEmpty())
{
def abc = ctx._source.user[0];
if (abc.get("id") instanceof java.util.ArrayList) {
abc.put("id", abc.get("id")[0]);
ctx._source.user=abc;
} else {
ctx._source.user=abc;
}
}else if (ctx._source.user instanceof java.util.HashMap && !ctx._source.user.isEmpty()) {
def abc = ctx._source.user;
if (abc.get("id") instanceof java.util.ArrayList){
abc.put("id", abc.get("id")[0]);
ctx._source.user=abc;
}
}
""",
"query": {
"bool": {
"must": [
{
"exists": {
"field": "user"
}
},
{
"range": {
"stats_day": {
"gte": "2021-01-01",
"lte": "2021-02-25"
}
}
}
]
}
}
}