Simple PHP client for ElasticSearch
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
docs
src/ElasticSearch
tests feature: add partial update ability. Dec 15, 2014
.gitignore Updated ignore pattern to ignore Vagrant files Apr 9, 2015
.travis.yml Update .travis.yml Oct 15, 2017
LICENSE Finally the license is included and named. Fixes #9 Feb 24, 2012
README.markdown Remove `<?php` tags from "README.markdown" Jun 25, 2015
composer.json fixed version of atoum in composer.json Jun 14, 2017
runtests.sh Rewrote last batch of tests to atoum Sep 5, 2012

README.markdown

Build Status

ElasticSearch PHP client

ElasticSearch is a distributed lucene powered search indexing, this is a PHP client for it

Usage

Initial setup

  1. Install composer. curl -s http://getcomposer.org/installer | php

  2. Create composer.json containing:

    {
        "require" : {
            "nervetattoo/elasticsearch" : ">=2.0"
        }
    }
  3. Run ./composer.phar install

  4. Keep up-to-date: ./composer.phar update

Indexing and searching

require_once __DIR__ . '/vendor/autoload.php';

use \ElasticSearch\Client;
// The recommended way to go about things is to use an environment variable called ELASTICSEARCH_URL
$es = Client::connection();

// Alternatively you can use dsn string
$es = Client::connection('http://127.0.0.1:9200/myindex/mytype');

$es->index(array('title' => 'My cool document'), $id);
$es->get($id);
$es->search('title:cool');

Creating mapping

$es->map(array(
    'title' => array(
        'type' => 'string',
	'index' => 'analyzed'
    )
));

Search multiple indexes or types

$results = $es
    ->setIndex(array("one", "two"))
    ->setType(array("mytype", "other-type"))
    ->search('title:cool');

Using the Query DSL

$es->search(array(
    'query' => array(
        'term' => array('title' => 'cool')
    )
);

Provide configuration as array

Using an array for configuration also works

$es = Client::connection(array(
    'servers' => '127.0.0.1:9200',
    'protocol' => 'http',
    'index' => 'myindex',
    'type' => 'mytype'
));

Support for Routing

$document = array(
    'title' => 'My routed document',
    'user_id' => '42'
);
$es->index($document, $id, array('routing' => $document['user_id']));
$es->search('title:routed', array('routing' => '42'));

Support for Bulking

$document = array(
    'title' => 'My bulked entry',
    'user_id' => '43'
);
$es->beginBulk();
$es->index($document, $id, array('routing' => $document['user_id']));
$es->delete(2);
$es->delete(3);
$es->commitBulk();


$es->createBulk()
    ->delete(4)
    ->index($document, $id, 'myIndex', 'myType', array('parent' => $parentId));
    ->delete(5)
    ->delete(6)
    ->commit();

Usage as a service in Symfony2

In order to use the Dependency Injection to inject the client as a service, you'll have to define it before. So in your bundle's services.yml file you can put something like this :

    your_bundle.elastic_transport:
        class: ElasticSearch\Transport\HTTP
        arguments:
            - localhost
            - 9200
            - 60

    your_bundle.elastic_client:
        class: ElasticSearch\Client
        arguments:
            - @your_bundle.elastic_transport

To make Symfony2 recognize the ElasticSearch namespace, you'll have to register it. So in your app/autoload.php make sure your have :

// ...

$loader->registerNamespaces(array(
    // ...
    'ElasticSearch' => __DIR__.'/path/to/your/vendor/nervetattoo/elasticsearch/src',
));

Then, you can get your client via the service container and use it like usual. For example, in your controller you can do this :

class FooController extends Controller
{
    // ...

    public function barAction()
    {
        // ...
        $es = $this->get('your_bundle.elastic_client');
        $results = $es
            ->setIndex(array("one", "two"))
            ->setType(array("mytype", "other-type"))
            ->search('title:cool');
    }
}