遇到大批量操作脚本时,且每个操作的变量不同时,可使用params对数据批量处理。
es代码:
POST /es索引/_update_by_query
{
"query": {
"match_all": {}
},
"script": {
"source": "……(脚本)……params.tag",
"lang": "painless",
"params": [
{
"tag": "key1"
},
{
"tag": "key2"
}
]
}
}
相当于:
POST /es索引/_update_by_query
{
"query": {
"match_all": {}
},
"script": {
"source": "……(脚本)……key1 ……(脚本)……key2",
"lang": "painless"
}
}
好处:
减少了脚本量,避免超出es限制范围。
java代码实现:
private void asyncKeyword(List<String> list, String index) throws IOException {
UpdateByQueryRequest update = new UpdateByQueryRequest(index);
// 创建你的脚本
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
List<Map<String, String>> params = new ArrayList();
for (int i = 0; i < list.size(); i++) {
Map<String, String> param = new HashMap();
param.put("tag", list.get(i));
params.add(param);
}
Map<String, Object> paramsMap = new HashMap();
paramsMap.put("params", params);
update.setScript(new Script(ScriptType.INLINE, "painless",
"脚本 params.tag",
paramsMap));
update.setQuery(queryBuilder);
elasticsearchClient.updateByQuery(update, RequestOptions.DEFAULT);
}