问题描述
编辑:
我的问题是由“;”引起的在行的末尾,我可能会通过阅读完整的错误消息来猜测:
'error': {
'type': 'illegal_argument_exception','reason': 'Failed to execute script','caused_by': {
'type': 'script_exception','reason': 'compile error','script_stack': ['... dd(params.collected_via)};
ctx ...,^---- HERE'],'caused_by': {
'type': 'illegal_argument_exception','reason': "unexpected token [';'] was expecting one of [<EOF>]."
}
}
}
我在第三个脚本解决方案中通过切换2行来修复它:
"script": {
"source": "ctx._source.internal_count = params.internal_count; \
if (!ctx._source.collected_via.contains(params.collected_via)) { ctx._source.collected_via.add(params.collected_via) }","lang": "painless","params": {
"collected_via": my_tag,"internal_count": my_count
}
================================================ =====================
原始问题:
elasticsearch(6.8)索引中的“ collected_via”字段是标签列表。文档更新后,标签列表将通过以下脚本进行更新:
"script": {
"source": "ctx._source.collected_via.add(params.collected_via); \
ctx._source.internal_count = params.internal_count","internal_count": my_count
}
如何转换此脚本以确保每个标签仅添加一次到列表中? 这是我尝试过的解决方案,但不起作用(“原因”:“执行脚本失败”):
"script": {
"source": "if (ctx._source.collected_via.contains(params.collected_via)) {} { ctx._source.collected_via.add(params.collected_via) }; \
ctx._source.internal_count = params.internal_count","internal_count": my_count
}
"script": {
"source": "ctx._source.collected_via = ctx._source.collected_via.add(params.collected_via).unique(); \
ctx._source.internal_count = params.internal_count","internal_count": my_count
}
"script": {
"source": "if (!ctx._source.collected_via.contains(params.collected_via)) { ctx._source.collected_via.add(params.collected_via) }; \
ctx._source.internal_count = params.internal_count","internal_count": my_count
}
解决方法
拯救数学!最好的方法是使用Set,根据定义,Set仅包含一次出现的给定元素。
// 1. create a set out of the current list
def set = new HashSet(ctx._source.collected_via);
// 2. add all new elements to the set
set.add(params.collected_via);
// 3. convert the set back to a list
ctx._source.collected_via = new ArrayList(set);