58 lines
1.8 KiB
Plaintext
58 lines
1.8 KiB
Plaintext
<?php
|
|
namespace Trinity\Bundle\SearchBundle\EventListener;
|
|
|
|
use Ivory\LuceneSearchBundle\Model\Field;
|
|
use Symfony\Component\DependencyInjection\Container;
|
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
|
use Trinity\Bundle\ContentManagerBundle\Model\Page;
|
|
use Trinity\Bundle\SearchBundle\Event\LuceneEvent;
|
|
use Trinity\Bundle\SearchBundle\TrinitySearchEvents;
|
|
use ZendSearch\Lucene\Document;
|
|
|
|
class LuceneSubscriber implements EventSubscriberInterface
|
|
{
|
|
protected $container;
|
|
|
|
public function __construct(Container $container)
|
|
{
|
|
$this->container = $container;
|
|
}
|
|
|
|
public static function getSubscribedEvents()
|
|
{
|
|
return array(
|
|
TrinitySearchEvents::LUCENE_ADD_INDEX => 'addDocument',
|
|
TrinitySearchEvents::LUCENE_UPDATE_INDEX => 'updateDocument',
|
|
TrinitySearchEvents::LUCENE_REMOVE_INDEX => 'removeDocument'
|
|
);
|
|
}
|
|
|
|
public function addDocument(LuceneEvent $event)
|
|
{
|
|
$index = $this->container->get('ivory_lucene_search')->getIndex($event->getIndex());
|
|
$document = $event->getObject()->getLuceneDocument($event->getIndex());
|
|
if ($document) {
|
|
$index->addDocument($document);
|
|
$index->commit();
|
|
$index->optimize();
|
|
}
|
|
}
|
|
|
|
public function removeDocument(LuceneEvent $event)
|
|
{
|
|
$index = $this->container->get('ivory_lucene_search')->getIndex($event->getIndex());
|
|
$hits = $index->find('pk:'.$event->getObject()->getIndexKey());
|
|
foreach ($hits as $hit) {
|
|
$index->delete($hit->id);
|
|
$index->commit();
|
|
}
|
|
$index->optimize();
|
|
}
|
|
|
|
public function updateDocument(LuceneEvent $event)
|
|
{
|
|
$this->removeDocument($event);
|
|
$this->addDocument($event);
|
|
}
|
|
}
|