【问题标题】:How to merge data in elasticsearch如何在elasticsearch中合并数据
【发布时间】:2023-03-26 20:37:01
【问题描述】:

我想在 Elasticsearch 中合并一些数据,但每次它都是替换我以前的数据而不是合并它。

假设当 i new 被创建时,它应该添加以前的数据,而不是替换以前的数据。因此,假设在名为“Christofer”的“update_field”中存在一个用户,所以当我 array_merge($usernames) 其中 $usernames 包含一个或几个用户名时,它总是替换以前的数据。

我正在研究 PHP。

        $usernames= array ("Johanna", "Maria");
        $doc = array();
        $doc['update_field'] = array_merge($usernames);

        $u_params = array();
        $u_params['id'] = 'my_id';
        $u_params['index'] = 'my_index';
        $u_params['type'] = 'my_type';

        $u_params['body'] = array('doc' => $doc);

        $client->update($u_params);

为了更清楚,例如,假设在用户名字段中有几个用户名存在 - 例如 - “Christofer”、“Henrik”、“Eric”。

所以现在我想添加更多用户,例如 - “Johanna”、“Maria”、...

现在,每次我合并和更新文档时,它都会替换数据,例如(“Christofer”、“Henrik”、“Eric”)被替换为(“Johanna”、“Maria”)。

我希望它们被添加而不是被替换。

有没有人知道我如何合并新数据,或者只是其他进程中的新数据。提前致谢。

【问题讨论】:

    标签: php arrays elasticsearch merge array-merge


    【解决方案1】:

    您需要使用partial update。试试这个,即您需要在正文中发送一个 doc 散列,其中包含要标记的字段(即 update_fields):

    $params = [
        'index' => 'my_index',
        'type' => 'my_type',
        'id' => 'my_id',
        'body' => [
            'doc' => [
                'update_field' => array_merge($usernames)
            ]
        ]
    ];
    $client->update($params);
    

    更新

    没错,核心价值观和数组正在被替换。 那么你可能想试试scripted partial update

        $usernames= array ("Johanna", "Maria");
        $script = array();
        $script['script'] = 'ctx._source.update_field += new_value';
        $script['params'] = array('new_value' => array_merge($usernames));
    
        $u_params = array();
        $u_params['id'] = 'my_id';
        $u_params['index'] = 'my_index';
        $u_params['type'] = 'my_type';
    
        $u_params['body'] = $script;
    
        $client->update($u_params);
    

    并确保在您的 elasticsearch.yml 配置文件中启用脚本:

    script.disable_dynamic: false
    

    【讨论】:

    • 感谢您的回答,但实际上我之前尝试过,但它对我不起作用,我已经更新了我的问题以更清楚,请您再看一次 :)谢谢
    • 非常感谢您的出色回答,尽管它返回此错误 ----{"error":"RemoteTransportException[[Fin][inet[/192.168.1.127:9300]][indices :data/write/update]]; 嵌套: ElasticsearchIllegalArgumentException[未能执行脚本]; 嵌套: ScriptException[类型为 [inline]、操作 [update] 和 lang [groovy] 的脚本被禁用]; ","status":400 }
    • 好的,是的,需要启用脚本,我的错。顺便问一下你用的是什么ES版本?
    • 非常感谢您的精彩回答 :)
    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2019-11-19
    相关资源
    最近更新 更多