Эластичный поиск и Codeigniter (PHP)

Я пытаюсь использовать 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);