我是一个拥有Locus Entities集合的Entity菌株。我使用Elasticsearch来索引Locus文档(在每个locus文档中我引用了一个Strain属性)。
我想做类似的事情:当用户编辑Strain实体时,它会手动重新索引(更新)所有Locus文档(因为我需要更新所有Locus文档中的Strain属性)。
为此,我选择在Doctrine PostUpdate事件中使用Listener,并检查它是否为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;
}
}
答案 0 :(得分:1)
最后我找到了一个解决方案:ObjectPersister(FOS \ ElasticaBundle \ Persister \ ObjectPersister),方法有: - &gt; 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;
}
}