PHP Elasticsearch ClientBuilder实现Upsert:保留原有字段问题求助
Elasticsearch 文档插入/更新(Upsert)正确实现方式
可以通过单个请求实现你需要的插入/更新操作,核心是使用Elasticsearch的update API配合doc和upsert(或doc_as_upsert)参数,而非会覆盖整个文档的index方法。
问题原因
你之前使用index方法时,会直接用新内容覆盖整个文档,导致原有字段丢失。而update API的doc参数只会更新指定字段,保留文档其他原有内容,结合upsert参数就能实现“不存在则创建,存在则更新指定字段”的需求。
实现代码示例
方式1:分别指定更新字段和初始插入内容
如果需要在文档不存在时插入包含更多字段的初始内容,可以分开定义doc和upsert:
$ID = "XYZ"; // 仅要更新的字段 $updateFields = ["field2" => 3]; // 文档不存在时插入的完整初始内容 $initialDoc = ["field1" => 1, "field2" => 3]; $params = [ 'index' => 'dataindex', 'id' => $ID, 'body' => [ 'doc' => $updateFields, 'upsert' => $initialDoc ] ]; $response = $client->update($params);
方式2:用doc_as_upsert简化代码
如果文档不存在时的初始内容和要更新的字段一致(比如只插入当前指定的字段),可以用doc_as_upsert参数避免重复编写内容:
$ID = "XYZ"; $updateFields = ["field2" => 3]; $params = [ 'index' => 'dataindex', 'id' => $ID, 'body' => [ 'doc' => $updateFields, 'doc_as_upsert' => true ] ]; $response = $client->update($params);
参数说明
doc:指定需要更新的字段,Elasticsearch只会修改这些字段的值,文档中其他现有字段保持不变upsert:当指定ID的文档不存在时,将此参数的内容作为新文档插入doc_as_upsert:设置为true后,若文档不存在,直接将doc中的内容作为新文档插入,无需单独定义upsert
内容的提问来源于stack exchange,提问作者Jáchym Brzezina
相关产品推荐
相关产品推荐

