symfony - Doctrine2和FOSElasticaBundle之间的同步不是实时的吗?

标签 symfony doctrine-orm elasticsearch foselasticabundle

我的网址/posts列出了最新的10篇 Activity 帖子。当我编辑最后一个帖子(这10个帖子中的第1个)时,更改似乎没有实时同步到elasticsearch。

这是我的代码:

    $post = $this->findPostBy....;

    /** @var EntityManager $entityManager */
    $entityManager = $this->getDoctrine()->getManager();
    $post->setStatus(PostModel::STATUS_DELETED);
    $entityManager->persist($post);
    $entityManager->flush();

    return $this->redirect('/posts'); 

执行上述代码后,我将被重定向到/posts,但是最后一个刚被编辑并且其状态已更改为的帖子被删除了仍被列为最新的10个 Activity 帖子(这肯定是错误的)。它仅在刷新页面(/posts)时消失。
/posts的代码:
    /** @var TransformedFinder $finder */
    $finder = $this->container->get('fos_elastica.finder.index_name.post');
    $query = new Query();
    $filter = new Term(array('status' => PostModel::STATUS_ACTIVE));
    $query->setFilter($filter);
    $query->addSort(array('tttAt' => array('order' => 'desc')));
    $posts = $finder->find($query);

我的映射:
        types:
            post:
                mappings:
                    title:
                        type: string
                        analyzer: post_analyzer
                    description:
                        type: string
                        analyzer: post_analyzer
                    status:
                        type: integer
                    tttAt :
                        type : date
                    createdAt :
                        type : date
                persistence:
                    driver: orm
                    model: MyBundle\Entity\Post
                    finder: ~
                    provider: ~
                    listener: ~

有人可以解释我为什么以及如何解决这个问题吗?

更新:如果我使用xdebug将重定向延迟大约1或2秒,则该帖子将不再在/posts中列出。因此,我认为没有足够的时间让ElasticSearch重新编制索引。有什么想法或解决方案吗?

最佳答案

刚刚找到了解决方案,也许不是最好的方法,但至少可以奏效:

    /** @var EntityManager $entityManager */
    $entityManager = $this->getDoctrine()->getManager();
    $post->setStatus(PostModel::STATUS_DELETED);
    $entityManager->persist($post);
    $entityManager->flush();

    /** @var Index $type */
    $type = $this->container->get('fos_elastica.index.index_name');
    $type->refresh();

重定向前刷新索引将完成:)

关于symfony - Doctrine2和FOSElasticaBundle之间的同步不是实时的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22892125/

相关文章:

php - Codeigniter 2 中的服务层与 Doctrine 2

elasticsearch - 使用 Kibana 6.0 或 7+ (v7.0.1) 从控制台创建索引模式

php - Sonata sonata_type_model_list 显示对象名称

php - FOSElasticaBundle 和 geo_distance 查找

php - Doctrine 2.1 - 实体插入

mongodb - Doctrine2 MongoDB ODM 复合键(UniqueEntity)

lucene - Elasticsearch使整个索引或类型为not_analyzed

elasticsearch - 如何对高级查询使用 Elasticsearch :

php - Symfony DI : Circular service reference with Doctrine event subscriber

ssl - Symfony2 中的 sfSslRequirementPlugin