FOSElasticaBundle和SoftDeletable Doctrine效果不佳

时间:2015-06-24 08:28:05

标签: symfony elastica foselasticabundle

我目前在我的项目中使用FOSElasticaBundle,而要搜索的实体正在使用softdeletable。似乎这不是很好,因为当实体被软删除时,弹性搜索的索引不会被删除。再次填充索引是一项非常昂贵的操作,由于我拥有大量项目(150万件物品),因此需要30分钟才能完成。

手动从弹性搜索中删除索引的最佳方法是什么?我打算使用softdeletable监听器,所以当软删除发生时,我会手动将其从索引中删除。但我不知道如何通过elastica做到这一点。

1 个答案:

答案 0 :(得分:2)

创建实体监听器:

<?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 }