You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							403 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
	
	
							403 lines
						
					
					
						
							11 KiB
						
					
					
				<?php | 
						|
/** | 
						|
 * @link http://www.yiiframework.com/ | 
						|
 * @copyright Copyright (c) 2008 Yii Software LLC | 
						|
 * @license http://www.yiiframework.com/license/ | 
						|
 */ | 
						|
 | 
						|
namespace yii\elasticsearch; | 
						|
 | 
						|
use yii\base\Component; | 
						|
use yii\helpers\Json; | 
						|
 | 
						|
/** | 
						|
 * The Command class implements the API for accessing the elasticsearch REST API. | 
						|
 * | 
						|
 * Check the [elasticsearch guide](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index.html) | 
						|
 * for details on these commands. | 
						|
 * | 
						|
 * @author Carsten Brandt <mail@cebe.cc> | 
						|
 * @since 2.0 | 
						|
 */ | 
						|
class Command extends Component | 
						|
{ | 
						|
	/** | 
						|
	 * @var Connection | 
						|
	 */ | 
						|
	public $db; | 
						|
	/** | 
						|
	 * @var string|array the indexes to execute the query on. Defaults to null meaning all indexes | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search.html#search-multi-index | 
						|
	 */ | 
						|
	public $index; | 
						|
	/** | 
						|
	 * @var string|array the types to execute the query on. Defaults to null meaning all types | 
						|
	 */ | 
						|
	public $type; | 
						|
	/** | 
						|
	 * @var array list of arrays or json strings that become parts of a query | 
						|
	 */ | 
						|
	public $queryParts; | 
						|
 | 
						|
	public $options = []; | 
						|
 | 
						|
	/** | 
						|
	 * @param array $options | 
						|
	 * @return mixed | 
						|
	 */ | 
						|
	public function search($options = []) | 
						|
	{ | 
						|
		$query = $this->queryParts; | 
						|
		if (empty($query)) { | 
						|
			$query = '{}'; | 
						|
		} | 
						|
		if (is_array($query)) { | 
						|
			$query = Json::encode($query); | 
						|
		} | 
						|
		$url = [ | 
						|
			$this->index !== null ? $this->index : '_all', | 
						|
			$this->type !== null ? $this->type : '_all', | 
						|
			'_search' | 
						|
		]; | 
						|
		return $this->db->get($url, array_merge($this->options, $options), $query); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * Inserts a document into an index | 
						|
	 * @param string $index | 
						|
	 * @param string $type | 
						|
	 * @param string|array $data json string or array of data to store | 
						|
	 * @param null $id the documents id. If not specified Id will be automatically choosen | 
						|
	 * @param array $options | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-index_.html | 
						|
	 */ | 
						|
	public function insert($index, $type, $data, $id = null, $options = []) | 
						|
	{ | 
						|
		$body = is_array($data) ? Json::encode($data) : $data; | 
						|
 | 
						|
		if ($id !== null) { | 
						|
			return $this->db->put([$index, $type, $id], $options, $body); | 
						|
		} else { | 
						|
			return $this->db->post([$index, $type], $options, $body); | 
						|
		} | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * gets a document from the index | 
						|
	 * @param $index | 
						|
	 * @param $type | 
						|
	 * @param $id | 
						|
	 * @param array $options | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-get.html | 
						|
	 */ | 
						|
	public function get($index, $type, $id, $options = []) | 
						|
	{ | 
						|
		return $this->db->get([$index, $type, $id], $options, null); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * gets multiple documents from the index | 
						|
	 * | 
						|
	 * TODO allow specifying type and index + fields | 
						|
	 * @param $index | 
						|
	 * @param $type | 
						|
	 * @param $ids | 
						|
	 * @param array $options | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-multi-get.html | 
						|
	 */ | 
						|
	public function mget($index, $type, $ids, $options = []) | 
						|
	{ | 
						|
		$body = Json::encode(['ids' => array_values($ids)]); | 
						|
		return $this->db->get([$index, $type, '_mget'], $options, $body); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * gets a documents _source from the index (>=v0.90.1) | 
						|
	 * @param $index | 
						|
	 * @param $type | 
						|
	 * @param $id | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-get.html#_source | 
						|
	 */ | 
						|
	public function getSource($index, $type, $id) | 
						|
	{ | 
						|
		return $this->db->get([$index, $type, $id]); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * gets a document from the index | 
						|
	 * @param $index | 
						|
	 * @param $type | 
						|
	 * @param $id | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-get.html | 
						|
	 */ | 
						|
	public function exists($index, $type, $id) | 
						|
	{ | 
						|
		return $this->db->head([$index, $type, $id]); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * deletes a document from the index | 
						|
	 * @param $index | 
						|
	 * @param $type | 
						|
	 * @param $id | 
						|
	 * @param array $options | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-delete.html | 
						|
	 */ | 
						|
	public function delete($index, $type, $id, $options = []) | 
						|
	{ | 
						|
		return $this->db->delete([$index, $type, $id], $options); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * updates a document | 
						|
	 * @param $index | 
						|
	 * @param $type | 
						|
	 * @param $id | 
						|
	 * @param array $options | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-update.html | 
						|
	 */ | 
						|
//	public function update($index, $type, $id, $data, $options = []) | 
						|
//	{ | 
						|
//		// TODO implement | 
						|
////		return $this->db->delete([$index, $type, $id], $options); | 
						|
//	} | 
						|
 | 
						|
	// TODO bulk http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html | 
						|
 | 
						|
	/** | 
						|
	 * creates an index | 
						|
	 * @param $index | 
						|
	 * @param array $configuration | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-create-index.html | 
						|
	 */ | 
						|
	public function createIndex($index, $configuration = null) | 
						|
	{ | 
						|
		$body = $configuration !== null ? Json::encode($configuration) : null; | 
						|
		return $this->db->put([$index], $body); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * deletes an index | 
						|
	 * @param $index | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-delete-index.html | 
						|
	 */ | 
						|
	public function deleteIndex($index) | 
						|
	{ | 
						|
		return $this->db->delete([$index]); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * deletes all indexes | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-delete-index.html | 
						|
	 */ | 
						|
	public function deleteAllIndexes() | 
						|
	{ | 
						|
		return $this->db->delete(['_all']); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * checks whether an index exists | 
						|
	 * @param $index | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-exists.html | 
						|
	 */ | 
						|
	public function indexExists($index) | 
						|
	{ | 
						|
		return $this->db->head([$index]); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @param $index | 
						|
	 * @param $type | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-types-exists.html | 
						|
	 */ | 
						|
	public function typeExists($index, $type) | 
						|
	{ | 
						|
		return $this->db->head([$index, $type]); | 
						|
	} | 
						|
 | 
						|
	// TODO http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-aliases.html | 
						|
 | 
						|
	// TODO http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-update-settings.html | 
						|
	// TODO http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-get-settings.html | 
						|
 | 
						|
	// TODO http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-warmers.html | 
						|
 | 
						|
	/** | 
						|
	 * @param $index | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-open-close.html | 
						|
	 */ | 
						|
	public function openIndex($index) | 
						|
	{ | 
						|
		return $this->db->post([$index, '_open']); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @param $index | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-open-close.html | 
						|
	 */ | 
						|
	public function closeIndex($index) | 
						|
	{ | 
						|
		return $this->db->post([$index, '_close']); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @param $index | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-status.html | 
						|
	 */ | 
						|
	public function getIndexStatus($index = '_all') | 
						|
	{ | 
						|
		return $this->db->get([$index, '_status']); | 
						|
	} | 
						|
 | 
						|
	// TODO http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-stats.html | 
						|
	// http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-segments.html | 
						|
 | 
						|
	/** | 
						|
	 * @param $index | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-clearcache.html | 
						|
	 */ | 
						|
	public function clearIndexCache($index) | 
						|
	{ | 
						|
		return $this->db->post([$index, '_cache', 'clear']); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @param $index | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-flush.html | 
						|
	 */ | 
						|
	public function flushIndex($index = '_all') | 
						|
	{ | 
						|
		return $this->db->post([$index, '_flush']); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @param $index | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-refresh.html | 
						|
	 */ | 
						|
	public function refreshIndex($index) | 
						|
	{ | 
						|
		return $this->db->post([$index, '_refresh']); | 
						|
	} | 
						|
 | 
						|
	// TODO http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-optimize.html | 
						|
 | 
						|
	// TODO http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-gateway-snapshot.html | 
						|
 | 
						|
	/** | 
						|
	 * @param $index | 
						|
	 * @param $type | 
						|
	 * @param $mapping | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-put-mapping.html | 
						|
	 */ | 
						|
	public function setMapping($index, $type, $mapping, $options = []) | 
						|
	{ | 
						|
		$body = $mapping !== null ? (is_string($mapping) ? $mapping : Json::encode($mapping)) : null; | 
						|
		return $this->db->put([$index, $type, '_mapping'], $options, $body); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @param string $index | 
						|
	 * @param string $type | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-get-mapping.html | 
						|
	 */ | 
						|
	public function getMapping($index = '_all', $type = '_all') | 
						|
	{ | 
						|
		return $this->db->get([$index, $type, '_mapping']); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @param $index | 
						|
	 * @param $type | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-put-mapping.html | 
						|
	 */ | 
						|
	public function deleteMapping($index, $type) | 
						|
	{ | 
						|
		return $this->db->delete([$index, $type]); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @param $index | 
						|
	 * @param string $type | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-get-field-mapping.html | 
						|
	 */ | 
						|
	public function getFieldMapping($index, $type = '_all') | 
						|
	{ | 
						|
		return $this->db->put([$index, $type, '_mapping']); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @param $options | 
						|
	 * @param $index | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-analyze.html | 
						|
	 */ | 
						|
//	public function analyze($options, $index = null) | 
						|
//	{ | 
						|
//		// TODO implement | 
						|
////		return $this->db->put([$index]); | 
						|
//	} | 
						|
 | 
						|
	/** | 
						|
	 * @param $name | 
						|
	 * @param $pattern | 
						|
	 * @param $settings | 
						|
	 * @param $mappings | 
						|
	 * @param int $order | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-templates.html | 
						|
	 */ | 
						|
	public function createTemplate($name, $pattern, $settings, $mappings, $order = 0) | 
						|
	{ | 
						|
		$body = Json::encode([ | 
						|
			'template' => $pattern, | 
						|
			'order' => $order, | 
						|
			'settings' => (object) $settings, | 
						|
			'mappings' => (object) $mappings, | 
						|
		]); | 
						|
		return $this->db->put(['_template', $name], $body); | 
						|
 | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @param $name | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-templates.html | 
						|
	 */ | 
						|
	public function deleteTemplate($name) | 
						|
	{ | 
						|
		return $this->db->delete(['_template', $name]); | 
						|
 | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @param $name | 
						|
	 * @return mixed | 
						|
	 * @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-templates.html | 
						|
	 */ | 
						|
	public function getTemplate($name) | 
						|
	{ | 
						|
		return $this->db->get(['_template', $name]); | 
						|
	} | 
						|
} |