Я пытаюсь использовать ElasticSearch с картой Codeigniter.
Я просто установил ElasticSearch и скопировал (: P) хорошую библиотеку PHP, найденную в Интернете, в библиотеки CI:
class Elasticsearch { public $config_file = 'elasticsearch'; public $index; function __construct($index = false){ $CI =& get_instance(); $CI->config->load($this->config_file); $this->server = $CI->config->item('es_server'); } function call($path, $http = array()){ if (!$this->index) throw new Exception('$this->index needs a value'); return json_decode(file_get_contents($this->server . '/' . $this->index . '/' . $path, NULL, stream_context_create(array('http' => $http)))); } //curl -X PUT http://localhost:9200/{INDEX}/ function create(){ $this->call(NULL, array('method' => 'PUT')); } //curl -X DELETE http://localhost:9200/{INDEX}/ function drop(){ $this->call(NULL, array('method' => 'DELETE')); } //curl -X GET http://localhost:9200/{INDEX}/_status function status(){ return $this->call('_status'); } //curl -X GET http://localhost:9200/{INDEX}/{TYPE}/_count -d {matchAll:{}} function count($type){ return $this->call($type . '/_count', array('method' => 'GET', 'content' => '{ matchAll:{} }')); } //curl -X PUT http://localhost:9200/{INDEX}/{TYPE}/_mapping -d ... function map($type, $data){ return $this->call($type . '/_mapping', array('method' => 'PUT', 'content' => $data)); } //curl -X PUT http://localhost:9200/{INDEX}/{TYPE}/{ID} -d ... function add($type, $id, $data){ echo $this->call($type . '/' . $id, array('method' => 'PUT', 'content' => $data)); } //curl -X GET http://localhost:9200/{INDEX}/{TYPE}/_search?q= ... function query($type, $q){ return $this->call($type . '/_search?' . http_build_query(array('q' => $q))); } }
то я пытаюсь создать индексы и просто получить их:
$this->load->library('elasticsearch'); $this->elasticsearch->index = 'comments'; $this->elasticsearch->create(); $data = '{author:jhon,datetime:2001-09-09 00:02:04}'; $this->elasticsearch->add($type ='details',$id = '1',$data);
когда я запускаю этот код, он показывает мне ошибки:
A PHP Error was encountered Severity: Warning Message: file_get_contents(http://localhost:9200/comments/) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request Filename: libraries/Elasticsearch.php Line Number: 19 A PHP Error was encountered Severity: Notice Message: file_get_contents() [function.file-get-contents]: Content-type not specified assuming application/x-www-form-urlencoded Filename: libraries/Elasticsearch.php Line Number: 19 A PHP Error was encountered Severity: Warning Message: file_get_contents(http://localhost:9200/comments/details/1) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request Filename: libraries/Elasticsearch.php Line Number: 19
я ошибаюсь / скучаю? извините, но я новичок о elasticsearch, а также немного с php: P
потому что если я перейду к:
http://localhost:9200/comments/details/1 //it prints in window {"_index":"comments","_type":"details","_id":"1","exists":false}
Я не совсем уверен, но я бы предпочел бы ваш призыв add()
:
$this->elasticsearch->add($type ='details',$id = '1',$data);
Вы не хотите устанавливать значения здесь. Я бы предположил, что вы получите ошибку php перед неправильным запросом HTTP, но я бы попробовал это первым:
$this->elasticsearch->add('details','1',$data);
Ваш метод add()
уже знает, что представляют собой аргументы, поэтому вам просто нужно передать данные.
Также
Похоже, ваш json может быть искажен.
// change $data = '{author:jhon,datetime:2001-09-09 00:02:04}'; // to $data = '{author:"jhon",datetime:2001-09-09 00:02:04}';
Библиотека PHP, которую вы указали, не определяет тип содержимого, поэтому вы получаете сообщение: «Тип содержимого не указан».
Проверьте библиотеку PHP здесь, а также просмотрите файл README.txt. В нем есть подробные заметки, которые будут полезны начинающим, и вы можете пройти через них: https://github.com/niranjan-uma-shankar/Elasticsearch-PHP-class
Если вы используете эту библиотеку, вы можете инициализировать класс следующим образом:
$this->load->library('elasticsearch'); $elasticSearch = new $this->elasticsearch; $elasticsearch->index = 'comments'; $elasticsearch->type = 'details'; $elasticsearch->create(); $data = '{"author" : "jhon", "datetime" : "2001-09-09 00:02:04"}'; $elasticsearch->add(1, $data);
Вызовите функции, передающие параметры без кавычек (одиночные или двойные):
$this->elasticsearch->add(details, 1, $data);
Кроме того, для меня проще работать с массивами, а затем кодировать их в json-объекты:
$data = array('author' => 'john', 'datetime' => '2001-09-09 00:02:04'); $this->elasticsearch->add(details, 1, json_encode($data));
Старый вопрос, но заслуживает обновления. Используйте этот плагин .
Поместите файл composer.json в папку приложения:
{ "require": { "elasticsearch/elasticsearch": "~2.0" } }
Чтобы установить плагин композитора и elasticsearch, выполните эти команды в командной оболочке bash:
curl -s http://getcomposer.org/installer | php php composer.phar install --no-dev
Установите php-curl и перезапустите Apache-сервер:
sudo apt-get install php5-curl sudo service apache2 restart
Создайте файл Elasticsearch.php в папке библиотек (codeigniter) и поместите в него:
<?php use Elasticsearch\ClientBuilder; class Elasticsearch{ public $client; public function __construct(){ $this->client = ClientBuilder::create()->build(); } }
Вы можете автозагрузить elasticsearch, отредактировав autoload.php в папке config:
$autoload['libraries'] = array(/*[some other library,]*/'elasticsearch');
Затем в вашей модели / контроллере используйте:
$this->elasticsearch->client->index($params);