7 votes

Elastic search et Codeigniter (PHP)

J'essaie d'utiliser ElasticSearch avec le framework Codeigniter.

Ce que j'ai fait, c'est installer ElasticSearch et copier ( :P ) une bonne bibliothèque PHP trouvée sur le web dans les bibliothèques 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)));
  }
}

puis j'essaie de créer des index et de les récupérer simplement :

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

Quand j'exécute ce code, il me montre des erreurs :

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

je me trompe ou j'ai raté quelque chose ? désolé mais je suis novice en elasticsearch et aussi un peu en php :P

parce que si je vais à :

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

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

3voto

swatkins Points 7623

Je ne suis pas tout à fait sûr, mais je pense que votre appel à add() :

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

Vous ne voulez pas fixer des valeurs ici. Je suppose que vous obtiendrez une erreur php avant une mauvaise requête HTTP, mais j'essaierais d'abord ceci :

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

Votre add() sait déjà ce que les arguments représentent, il suffit donc de transmettre les détails.

Aussi

Il semble que votre json soit malformé.

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

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

3voto

Steven Points 495

Une vieille question, mais qui mérite une mise à jour. Utilisez ce plugin .

Mettez votre composer.json dans le dossier de l'application :

{
     "require": {
     "elasticsearch/elasticsearch": "~2.0"
     }
}

Pour installer compositeur et le plugin elasticsearch exécuter ces commandes dans le shell bash :

curl -s http://getcomposer.org/installer | php
php composer.phar install --no-dev

Installer php-curl et redémarrez le serveur apache :

sudo apt-get install php5-curl
sudo service apache2 restart

Créer un Elasticsearch.php dans le dossier des bibliothèques (codeigniter), et mettez ce code dedans :

<?php 
use Elasticsearch\ClientBuilder;

class Elasticsearch{

    public $client;

    public function __construct(){
        $this->client = ClientBuilder::create()->build();
    } 
}

Vous pouvez autoloader elasticsearch en modifiant autoload.php dans le dossier de configuration :

$autoload['libraries'] = array(/*[some other library,]*/'elasticsearch');

Ensuite, dans votre modèle/contrôleur, utilisez :

$this->elasticsearch->client->index($params);

2voto

Ninja Points 1906

La bibliothèque PHP que vous avez donnée ne définit pas le content-type, c'est pourquoi vous obtenez le message : "Content-type not specified".

Vérifiez la bibliothèque PHP ici et lisez également le fichier README.txt. Il contient des notes détaillées qui seront utiles aux débutants et vous voudrez peut-être les lire : https://github.com/niranjan-uma-shankar/Elasticsearch-PHP-class

Si vous utilisez cette bibliothèque, vous pouvez initialiser la classe comme ceci :

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

0voto

Guillem Points 1

Appelez les fonctions en passant les paramètres sans guillemets (simples ou doubles) :

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

En outre, pour moi, il est plus facile de travailler avec des tableaux, puis de les encoder en objets json :

$data = array('author' => 'john', 'datetime' => '2001-09-09 00:02:04');
$this->elasticsearch->add(details, 1, json_encode($data));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X