sbaaaang sbaaaang - 6 months ago 26
PHP Question

Elastic search and Codeigniter (PHP)

I'm trying using ElasticSearch with Codeigniter framework.

What i did is just install ElasticSearch and copyed ( :P ) a good PHP library found on the web to CI libraries:

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)));
}
}


then i'm trying creating indexes and simply retrieve them:

$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);


when i run this code it show me errors:

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


does i'm mistaking/missed somenthing? sorry but i'm newbie about elasticsearch and also a little bit with php :P

cause if i go to:

http://localhost:9200/comments/details/1

//it prints in window
{"_index":"comments","_type":"details","_id":"1","exists":false}

Answer

I'm not quite sure, but my guess would be your call to add():

$this->elasticsearch->add($type ='details',$id = '1',$data);

You don't want to be setting values here. I would assume you'd get a php error before an HTTP bad request, but I would try this first:

$this->elasticsearch->add('details','1',$data);

Your add() method already knows what the arguments represent, so you just need to pass the details.

Also

It looks like your json might be malformed.

// change
$data = '{author:jhon,datetime:2001-09-09 00:02:04}';

// to
$data = '{author:"jhon",datetime:2001-09-09 00:02:04}';