Hibernate Search6 MassIndexer执行后提示Indexed 0实体问题求助
问题排查与解决步骤
- 验证实体查询可用性
手动执行单实体计数查询,确认底层ORM可以正常读取到实体数据:
// 替换为你自己的实体类名逐一测试 Long count = (Long) entityManager.createQuery("select count(p) from PersonaEntity p") .getSingleResult(); System.out.println("PersonaEntity实体总数:" + count);
如果该查询返回0,说明问题出在ORM层的实体查询配置,与Hibernate Search无关。如果返回非0,则继续向下排查。
- 检查实体类过滤注解
确认你的索引实体类上是否加了@Where、@Filter、@SQLDelete这类Hibernate过滤注解,MassIndexer默认会应用这些过滤规则。如果你的过滤规则刚好排除了所有数据(比如软删除标记默认过滤已删除数据,但你没配置过滤参数),就会出现查询结果为0的情况。
你可以通过MassIndexer显式关闭对应过滤规则:
searchSession.massIndexer() .purgeAllOnStart(true) // 替换为你自己的过滤器名称,关闭对应过滤 .enableHibernateOrmFilter("你的过滤器名称", false) .startAndWait();
- 检查事务上下文配置
如果是Spring等容器环境,确认调用MassIndexer的方法是否开启了有效的读写事务。可以尝试给调用方法添加事务注解强制开启新的读写事务:
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) public void massIndex() throws InterruptedException { SearchSession searchSession = Search.session(entityManager); searchSession.massIndexer().startAndWait(); }
- 排查多租户配置问题
如果你使用了Hibernate多租户配置,需要给MassIndexer显式指定租户ID:
searchSession.massIndexer() .tenantId("你的租户ID") .startAndWait();
- 添加监听器确认问题环节
给MassIndexer添加自定义监听器,确认是加载实体环节出问题还是索引写入环节出问题:
searchSession.massIndexer() .monitoring(new MassIndexingMonitor() { @Override public void entitiesLoaded(int count) { // 这里如果输出0,说明ORM查询实体阶段就没有拿到数据 System.out.println("已加载实体数量:" + count); } @Override public void documentsAdded(long count) {} @Override public void documentsBuilt(long count) {} @Override public void entitiesAddedToQueue(long count) {} @Override public void indexingCompleted() {} }) .startAndWait();
内容的提问来源于stack exchange,提问作者user16906260
相关产品推荐
相关产品推荐

