FOSElasticaBundle и SoftDeletable Doctrine работают не очень хорошо

В настоящее время я использую FOSElasticaBundle в своих проектах, и объекты, которые нужно искать, используют мягкоудаляемый . Похоже, что дела обстоят не очень хорошо, поскольку при мягком удалении объекта индекс эластичного поиска не удаляется. Повторное заполнение индекса — очень дорогая операция и занимает 30 минут из-за большого набора элементов, который у меня есть (1,5 миллиона элементов).

Каков наилучший способ вручную удалить индекс из эластичного поиска? Я планировал использовать прослушиватель softdeletable, поэтому, когда произойдет softdelete, я вручную удалю его из индекса. Но я не уверен, как это сделать через эластику.


person adit    schedule 24.06.2015    source источник


Ответы (1)


Создайте прослушиватель сущностей:

<?php


namespace Acme\MainBundle\EventListener;

use Acme\MainBundle\Entity\InstagramShopPicture;
use Acme\MainBundle\Entity\InstagramShop;

class ElasticSearchSoftdeletableListener
{
private $container;

public function __construct($container)
{
    $this->container = $container;
}

public function postSoftDelete(LifecycleEventArgs $args)
{
    $entity = $args->getEntity();

    if ($entity instanceof InstagramShopPicture) {
        $type = 'picture';
    } else if ($entity instanceof InstagramShop) {
        $type = 'shop';
    } else {
        return;
    }

    $this->container->get("fos_elastica.listener.index.$type")->postRemove($args);
}
}

Зарегистрируйте слушателя через сервис:

    softdeletable.listener:
    class: Acme\MainBundle\EventListener\ElasticSearchSoftdeletableListener
    arguments:
        - @service_container
    tags:
        - { name: doctrine.event_listener, event: postSoftDelete }
person Serhii Smirnov    schedule 03.07.2015