如何在elasticsearch中合并数据

How to merge data in elasticsearch

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

假设当我创建新的时,它应该添加以前的数据,而不是替换以前的数据。所以假设 "update_field" 中存在一个名为 "Christofer" 的用户,所以当我 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").

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

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

您需要使用 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