手动更新 FOs:Elastica 中的实体集合

Manually update a collection of Entity in FOs:Elastica

我有一个包含基因座实体集合的实体菌株。我使用 Elasticsearch 来索引 Locus 文档(在每个轨迹文档中我指的是一个 Strain 属性)。

我想做这样的事情:当用户编辑 Strain 实体时,它手动重新索引(更新)所有 Locus 文档(因为我需要更新所有 Locus 文档中的 Strain 属性)。

为此,我选择在 Doctrine PostUpdate 事件上使用一个监听器,并检查它是否是一个 Strain 对象。但我不知道如何要求弹性搜索对我的对象进行重新索引。 有人知道怎么做吗?

<?php

namespace AppBundle\EventListener;

use AppBundle\Entity\Strain;
use Doctrine\ORM\Event\LifecycleEventArgs;

class StrainListener
{
    public function postUpdate(LifecycleEventArgs $args)
    {
        $em = $args->getEntityManager();
        $strain = $args->getEntity();

        if (!$strain instanceof Strain) {
            return;
        }

        $locusList = $em->getRepository('AppBundle:Locus')->findLocusFromStrain($strain);

        // A command that ask to Elasticsearch reindex Locus

        return;
    }
}

最后我找到了一个解决方案:ObjectPersister (FOS\ElasticaBundle\Persister\ObjectPersister),方法是:->replaceMany(array);

<?php

namespace AppBundle\EventListener;

use AppBundle\Entity\Strain;
use Doctrine\ORM\Event\LifecycleEventArgs;
use FOS\ElasticaBundle\Persister\ObjectPersister;

class StrainListener
{
    private $objectPersister;

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

    public function postUpdate(LifecycleEventArgs $args)
    {
        $strain = $args->getEntity();

        if (!$strain instanceof Strain) {
            return;
        }

        $em = $args->getEntityManager();
        $locusList = $em->getRepository('AppBundle:Locus')->findLocusFromStrain($strain);

        $this->objectPersister->replaceMany($locusList);

        return;
    }
}