This Bundle provides a simple API to index and query a Solr Index., (*1)
Installation
Solr-Server, (*2)
Follow the installation instructions in this Tutorial, (*3)
PHP-Extension, (*4)
sudo pecl install -n solr-beta
Bundle, (*5)
-
Register bundle in AppKernel.php, (*6)
# app/AppKernel.php
$bundles = array(
// ...
new FS\SolrBundle\FSSolrBundle(),
// ...
);
-
Add Bundle to autoload, (*7)
# app/autoload.php
$loader->registerNamespaces(array(
// ...
'FS' => __DIR__.'/../vendor/bundles',
// ...
));
Configuration
You have to setup the connection options, (*8)
# app/config/config.yml
fs_solr:
solr:
hostname: localhost
port: 8983
path:
core0: /solr/core0
core1: /solr/core1
auto_index: true|false
entity_manager: default
Usage
To put an entity to the index, you must add some annotations to your entity:, (*9)
// your Entity
// ....
use FS\SolrBundle\Doctrine\Annotation as Solr;
/**
*
*
* @Solr\Document(repository="Full\Qualified\Class\Name")
* @ORM\Table()
*/
class Post
{
/**
* @Solr\Id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
*
* @Solr\Field(type="string")
*
* @ORM\Column(name="title", type="string", length=255)
*/
private $title = '';
/**
*
* @Solr\Field(type="string")
*
* @ORM\Column(name="text", type="text")
*/
private $text = '';
/**
* @Solr\Field(type="date")
*
* @ORM\Column(name="created_at", type="datetime")
*/
private $created_at = null;
}
If you persist this entity, it will put automaticlly to the index. Update and delete happens automatically too., (*10)
To query the index you have to call some services., (*11)
$query = $this->get('solr')->createQuery('AcmeDemoBundle:Post');
$query->addSearchTerm('title', 'my title');
$query->addField('id');
$query->addField('text');
$result = $query->getResult();
The $result array contains all found entities. The solr-service does all mappings from SolrDocument
to your entity for you. In this case only the fields id and text will be mapped (addField()), so title and created_at will be
empty. If nothing was found $result is empty., (*12)
If no field was explict add, all fields will be mapped., (*13)
$query = $this->get('solr')->createQuery('AcmeDemoBundle:Post');
$query->addSearchTerm('title', 'my title');
$result = $result = $query->getResult();
The pervious examples have queried only the field 'title'. You can also query all fields with a string., (*14)
$query = $this->get('solr')->createQuery('AcmeDemoBundle:Post');
$query->queryAllFields('my title);
$result = $query->getResult();
To index your entities manually, you can do it the following way:, (*15)
$this->get('solr')->addDocument($entity);
$this->get('solr')->updateDocument($entity);
$this->get('solr')->deleteDocument($entity);
The delete action needs the id of the entity., (*16)
If you specify your own repository you must extend the FS\SolrBundle\Repository\Repository
class. The useage is the same
like Doctrine-Repositories:, (*17)
$myRepository = $this->get('solr')->getRepository('AcmeDemoBundle:Post');
$result = $myRepository->mySpecialFindMethod();
If you haven't declared a concrete repository in your entity and you calling $this->get('solr')->getRepository('AcmeDemoBundle:Post')
, you will
get an instance of FS\SolrBundle\Repository\Repository
., (*18)
MongoDB
All this functionality is also avaiable for mongo-db entities. The entity configuration via annotations is absolutly the same., (*19)
Use multiple Cores
Solr supports multiple indexies. If you have different languages in your application, use can index your documents in different indexies., (*20)
The setup is easy:, (*21)
Under the path
option, you can specify your different indexies., (*22)
path:
core0: /solr/core0
core1: /solr/core1
In this case the default core is core0
. If you use multiple core, then the auto-index functionality should be disabled. In other case all document will index in one core. To disable use the flag auto_index
in your config (default value is true
)., (*23)
To index documents with the addDocument
method requires a concrete core:, (*24)
$this->get('solr')->core('core0')->addDocument($document);
Commands
There are comming two commands with this bundle:, (*25)
-
solr:index:clear
- delete all documents in the index
-
solr:synchronize
- synchronize the db with the index. You have to specify an entity.