如何在elasticsearch中合并数据


How to merge data in elasticsearch

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

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

I am working on 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")替换。

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

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

您需要使用部分更新。试着这样做,也就是说,你需要在正文中发送一个doc哈希值,其中包含要分割的字段(即update_fields):

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

没错,核心值和数组被替换了。您可能想尝试脚本部分更新然后

    $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