Symfony增删数据后ElasticSearch索引未自动更新需手动populate
问题根因
Elasticsearch 索引不随实体增删改自动同步,由两处疏漏导致:
fos_elastica.yml未开启 Doctrine 生命周期事件监听,FOSElasticaBundle 无法感知实体数据变更,自然不会触发索引更新- 删除操作调用
ReplyRepository::remove()时未传入$flush=true参数,删除操作不会真正提交到数据库,也无法触发Doctrine的实体删除事件
修复方案
1. 修正FOSElastica配置
在config/packages/fos_elastica.yml的persistence节点下新增listener配置,开启自动事件监听:
fos_elastica: clients: default: { url: '%env(ELASTICSEARCH_URL)%' } indexes: reply: properties: category: type: object properties: title: ~ persistence: driver: orm model: App\Entity\Reply # 新增以下配置 listener: enabled: true insert: true update: true delete: true
2. 修正删除方法的代码
将控制器delete方法中的$this->replyRepository->remove($reply);修改为:
$this->replyRepository->remove($reply, true);
说明:Symfony 命令生成的Repository
add/remove方法,第二个参数控制是否执行EntityManager::flush()。只有执行flush时,Doctrine才会触发对应实体的生命周期事件,FOSElastica的监听逻辑正是绑定在这些事件上实现索引同步的。你之前新增、编辑操作传了第二个参数true所以数据库写入正常,但因为未开启事件监听,索引不会更新;而删除操作不仅没开监听,还漏传了flush参数。
3. 清除配置缓存
执行以下命令清除Symfony缓存让新配置生效:
php bin/console cache:clear
验证
修复完成后,新增、编辑、删除Reply实体时,Elasticsearch索引会自动同步,无需手动执行fos:elastica:populate命令刷新索引。
内容的提问来源于stack exchange,提问作者Chaitya Panchal
相关产品推荐
相关产品推荐

