本文重点介绍php开发过程中的elasticsearch文档更新的两种方法
第一种,通过doc更新,如果不存在文档则通过upsert添加
$params = [
'index' => 'news',
'type' => 'magic',
'id' => $param['information_id'],
'body' => [
'doc'=>[
'title' => $param['title'],
'cover' => $cover,
'introduction' => $param['introduction'],
],
'upsert'=>[
'information_id' => $param['information_id'],
'title' => $param['title'],
'cover' => $cover,
'introduction' => $param['introduction'],
'views'=>intval($news['views']),
'create_time'=>date('Y-m-d H:i:s')
]
]
];
$es->update($params);
注意,如果如果不存在文档的情况下,不添加upsert文档会报错,所以我们只需在body内添加相关字段及其值
'upsert'=>[
'information_id' => $param['information_id'],
'title' => $param['title'],
'cover' => $cover,
'introduction' => $param['introduction'],
'views'=>intval($news['views']),
'create_time'=>date('Y-m-d H:i:s')
]
第二种是script脚本更新,比较适合对单个字段做计算,比如自增自减。如果不存在文档则通过upsert添加
$params = [
'index' => 'news',
'type' => 'magic',
'id' => $param['information_id'],
'body' => [
'script'=>[
'source'=>'ctx._source.views+=params.views;ctx._source.praise+=params.praise',
'params' => [
'views' => 2,
'praise' => 1,
]
],
'upsert'=>[
'information_id' => $param['information_id'],
'title' => $param['title'],
'cover' => $cover,
'introduction' => $param['introduction'],
'views'=>intval($news['views']),
'create_time'=>date('Y-m-d H:i:s')
]
]
];
$es->update($params);
这里注意的是script数组里面的params对应的每个字段的值,如views和praise的值对应source里面params.views和params.praise ,也就是会对应增加2和1.
可以尝试一下,第一次不存在的时候,通过upsert没有添加praise,而再次执行的时候因为存在文档会更新,praise会在更新的同时自动添加