当前位置: 首页 > 面试题库 >

Elasticsearch向上插入并追加到数组

颜文昌
2023-03-14
问题内容

我正在尝试编写一个脚本,该脚本会将新的用户记录追加到ElasticSearch,如果该用户已经存在,则更新任何信息,如果新对象中存在更新的PaymentInfo对象,则将其添加到用户的Payments数组中。这是到目前为止我正在使用的简化版本:

curl -XPOST 'http://localhost:9200/usrtest/usr/1/_update' -d '
{
    "doc_as_upsert": true, 
    "doc": {
        "customerId": "1",
        "firstName": "Mark",
        "lastName": "Z",
        "emailAddress": "foo.bar@gmail.com",
        "paymentInfo": {
            "pid": "1",
            "amt": "10"
        }
    }
}'

这几乎可以满足我的要求,因为它可以正确地插入文档,或者如果用户具有相同的ID,则可以更新文档,但是如果该用户已经存在,则缺少将这个PaymentInfo添加到用户的paymentInfos数组中的方面。目前,它只是覆盖了PaymentInfo对象。我尝试将此脚本添加到更新JSON:

"script": "if (ctx._source.containsKey(\"paymentInfos\")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = paymentInfo}"

但是docscript指定元素时,elasticsearch会忽略元素。

我觉得我在这里想念一些愚蠢的东西,但不确定。这里有人可以帮我吗?

编辑: 我也尝试了以下方法:

curl -XPOST 'http://localhost:9200/usrtest/usr/1/_update' -d '
{    
    "script": "if (ctx._source.containsKey(\"paymentInfos\")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = paymentInfo}",
    "upsert": {
        "customerId": "1",
        "firstName": "Mark",
        "lastName": "Z",
        "emailAddress": "foo.bar@gmail.com",
        "paymentInfo": {
            "pid": "1",
            "amt": "10"
         }
    },
    "params": {
         "paymentInfo": {
            "pid": "1",
                "amt": "10"
         }
    }
}'

几乎达到
了我想要的目的,因为当我多次运行脚本时,它会添加paymentInfo对象,但是否则它不会更新文档本身(即,如果我再次运行脚本,将Mark更改为Mindy,它将不会更新,因为upsert仅在文档尚不存在时才使用元素)。


问题答案:

您需要在脚本的插入部分添加一些数组括号。

"script": "if (ctx._source.containsKey(\"paymentInfos\")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = [paymentInfo]}"

第一部分中的’paymentInfos’属性定义为一个对象,因此也可能导致您摔倒。



 类似资料:
  • 问题内容: 我已经编写了基本的python代码段,以首先在列表中插入值,然后反转它们。我发现insert和append方法之间的执行速度存在巨大差异。 片段1: 执行此操作所需的时间: 片段2: 执行时间: 我希望代码片段2的性能比snippet1好得多,因为我直接通过在前面插入数字来执行反向操作。但是所花费的时间却相反。我不明白为什么后一种方法需要更多时间来执行,即使该方法看起来更优雅。有人对此

  • 问题内容: 我正在尝试使用附加值填充一个空的(不是np.empty!)数组,但我却报错: 我的代码如下: 我得到: 问题答案: 与list.append在python中非常不同。我知道这是numpy的一些新程序员所引发的。更像是连接,它创建一个新数组,并用旧数组中的值和要附加的新值填充它。例如: 我认为您可以通过执行以下操作来实现目标: 更新: 如果需要使用循环创建一个numpy数组,并且您不提前

  • 问题内容: 我正在使用ajax提交包含数组,文本字段和文件的多部分表单。 我将每个VAR附加到主数据中 然后我使用ajax函数将其发送到PHP文件以存储在sql DB中。 但是在PHP方面,变量(即数组)显示为字符串。 当我不使用ajax作为表单数据发送它,而是使用简单的选项时,确实在PHP端将它作为数组获得,但是后来我也无法发送文件。 有什么办法吗? 问题答案: 您有几种选择: 将其转换为JSO

  • 我使用Azure Stream Analytics将Json复制到DocumentDB,并使用upsert用最新数据覆盖文档。这对于我的基础数据来说很好,但我希望能够附加列表数据,因为不幸的是,我一次只能发送一个列表项。 在下面的示例中,文档在id上匹配,并且所有项目都更新了,但我希望“myList”数组随着来自每个文档的“myList”数据(具有相同的id)不断增长。这可能吗?是否有其他方法使用

  • 问题内容: 如何在JavaScript中将对象(例如字符串或数字)附加到数组? 问题答案: 使用该方法将值附加到数组: 您可以使用该函数在单个调用中将多个值附加到数组中: 更新资料 如果要将一个数组的项目添加到另一个数组,则可以使用: 更新资料 如果您想将任何值附加到数组的开头(这意味着第一个索引),则可以添加此答案,您可以为此目的使用它。 它也支持一次附加多个值。

  • 我正在使用spark从Terradata表读取数据,并希望在Oracle中升级该表。我可以插入数据,但我可以执行UPSERT吗? 这就是我如何将数据插入Oracle。 数据帧。写模式(SaveMode.Append)。jdbc(url,表6,道具)