elasticsearch存在文档更新,不存在新增

1,061 阅读1分钟

本文重点介绍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会在更新的同时自动添加