Эластичный поиск и Codeigniter (PHP) - PullRequest
7 голосов
/ 11 ноября 2011

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

я ошибаюсь / пропустил somenthing? извините, но я новичок в отношении эластичного поиска, а также немного с php: P

причина, если я пойду на:

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

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

Ответы [ 4 ]

3 голосов
/ 15 мая 2016

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

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

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

Чтобы установить composer , и плагин эластичный поиск выполните этиКоманды в оболочке 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();
    } 
}

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

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

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

$this->elasticsearch->client->index($params);
3 голосов
/ 11 ноября 2011

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

Библиотека 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);
0 голосов
/ 29 ноября 2011

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

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