我想在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