ElasticSearch is a distributed lucene powered search indexing, this is a PHP client for it
-
Install composer.
curl -s http://getcomposer.org/installer | php
-
Create
composer.json
containing:{ "require" : { "nervetattoo/elasticsearch" : ">=2.0" } }
-
Run
./composer.phar install
-
Keep up-to-date:
./composer.phar update
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');
$results = $es
->setIndex(array("one", "two"))
->setType(array("mytype", "other-type"))
->search('title:cool');
$es->search(array(
'query' => array(
'term' => array('title' => 'cool')
)
);
Using an array for configuration also works
$es = Client::connection(array(
'servers' => '127.0.0.1:9200',
'protocol' => 'http',
'index' => 'myindex',
'type' => 'mytype'
));
$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'));
$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();
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');
}
}