Here is a demo Symfony application of Jane with Elasticsearch integration.
You can find the fully working example on this repository: janephp/demo-with-elasticsearch.
First, we need to index entities into Elasticsearch, to do that I made a command you can find in
project/src/Command/IndexCommand.php
. Here is the same code, decomposed to explain each steps:
// Here, $client is an instance of JoliCode\Elastically\Client, we use this library on top of Elastica to create // indexes, send documents, send requests and read results. // With that `getIndexBuilder` method, we get a class to build indexes. $indexBuilder = $client->getIndexBuilder(); // We create an index called "beers" (with date suffix) $index = $indexBuilder->createIndex(self::BEERS_INDEX); // We update the "beers" alias with this new index $indexBuilder->markAsLive($index, self::BEERS_INDEX); // Class to index our documents $indexer = $client->getIndexer(); // We fetch all beers from database $beers = $this->beerRepository->findAll(); foreach ($beers as $beer) { // For each entity, we convert it to a Generated\Model\Beer DTO $model = $this->autoMapper->map($beer, \Generated\Model\Beer::class); // We put it in a Document in order to index it $document = new \Elastica\Document($beer->getId(), $model); // And we schedule the Document to "beers" index $indexer->scheduleIndex(self::BEERS_INDEX, $document); } // Flush all schedule documents & refresh "beers" index $indexer->flush(); $indexer->refresh(self::BEERS_INDEX);
Then you can see in project/src/Controller/BeerController.php
file some interaction to show Elasticsearch results.
Same as before, decomposed code to explain each step:
// With the `getIndex` method, we get a reference of the index we want (here I'm asking for 'beers' index) $index = $client->getIndex(self::BEERS_INDEX); // And we make a search query on the index (no arguments means we search for any result) $resultSet = $index->search(); // We get the results for given $resultSet $results = $resultSet->getResults(); $output = ['beers' => []]; foreach ($results as $result) { // Then we get the model for each result // Here, thanks to Elastically and the Symfony serializer, the `getModel` // method will return a Generated\Model\Beer instance $output['beers'][] = $result->getModel(); } return $this->json($output);