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

#php #codeigniter #file-get-contents #elasticsearch

#php #инициатор кодирования #файл-получить-содержимое #эластичный поиск #codeigniter

Вопрос:

Я пытаюсь использовать ElasticSearch с фреймворком Codeigniter.

Что я сделал, так это просто установил ElasticSearch и скопировал ( : P ) хорошую библиотеку PHP, найденную в Интернете, в библиотеки CI:

     class Elasticsearch {

  public $config_file = 'elasticsearch';
  public $index;

  function __construct($index = false){
      $CI =amp; 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}
  

Комментарии:

1. я хочу спросить, как использовать эластичный поиск с CodeIgniter. а также как установить в CodeIgniter..

2. @PuzzledBoy Ссылка на установку CI: ellislab.com/codeigniter/user-guide/installation тогда вы можете использовать библиотеки, подобные этой github.com/confact/elasticsearch-codeigniter-library/blob / … для сопряжения вашего CI с эластичным поиском

3. хорошо, спасибо .. это может быть полезно для меня.

4. Можем мы поболтать пару минут.. если у вас есть время.. мне нужно спросить об elasticsearch basic. 🙂

5. @PuzzledBoy я не уверен, что смогу вам помочь, потому что я давно не использую elasticsearch, я, наверное, забыл, как им пользоваться: (

Ответ №1:

Я не совсем уверен, но я предполагаю, что вы обратились бы к 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}';
  

Комментарии:

1. спасибо за предложения, да, я пропустил некоторые основы в моем sintax, но ошибка сохраняется, я думаю, что я пропустил что-то гораздо более важное, хм…

2. @sbaaaang ты нашел решение? я не могу вставить данные

3. @dhpratik нет, я должен признать, что в то время я сдался, я никогда не использовал elasticsearch тогда, из-за слишком больших проблем с CI: P для следующего PHP-проекта, который я перейду на Laravel, на данный момент мне кажется намного лучше

4. @dhpratik вы получаете какую-либо ошибку? можете ли вы показать что-нибудь, чем я могу помочь, я думаю

5. это не выдало никакой ошибки. но при попытке добавить данные в индекс они не были вставлены. позже я изменил библиотечную функцию ‘add’. использовалась функция добавления http put , я изменил ее на post

Ответ №2:

Старый вопрос, но заслуживает обновления. Используйте этот плагин.

Поместите ваш composer.json файл в папку приложения:

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

Чтобы установить composer и плагин 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 файл в папке libraries (codeigniter) и поместите этот код внутрь:

 <?php 
use ElasticsearchClientBuilder;

class Elasticsearch{

    public $client;

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

Вы можете автоматически загрузить elasticsearch, отредактировав autoload.php в папке конфигурации:

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

Затем в вашей модели / контроллере используйте:

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

Ответ №3:

Предоставленная вами библиотека 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);
  

Ответ №4:

Вызывайте функции, передающие параметры без кавычек (одинарных или двойных):

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