Elasticsearch轻松更新唯一元素列表

问题描述

编辑:

我的问题是由“;”引起的在行的末尾,我可能会通过阅读完整的错误消息来猜测:

'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);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...