1

我有/posts列出最新 10 个活跃帖子的网址。当我编辑最后一篇文章(这 10 篇中的第一篇)时,更改似乎不会实时同步到 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 个活动帖子(这绝对是错误的)。只有当我刷新页面 ( /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 没有足够的时间重新索引。有什么想法或解决方案吗?

4

2 回答 2

1

刚刚找到了一个解决方案,也许不是最好的方法,但至少它有效:

    /** @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();

在重定向之前刷新索引会很有效:)

于 2014-04-06T16:52:22.003 回答
0

基于 Michael Bui 的回答,我发现以下代码片段可以使用最新版本的 FOSElasticaBundle 为我解决问题:

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

/** @var \Elastica\Type $type */
$type = $this->container->get('fos_elastica.index.--INDEX--.--TYPE--');
$type->getIndex()->refresh();

为他的回答发布的评论显然仍然适用:不要将它用于经常做的任何事情。

另一个简单的解决方案是在 ElasticSearch 中的任何刷新间隔都休眠,默认设置为一秒。

于 2015-04-14T14:26:24.503 回答