Hibernate search 6,更新实体后刷新索引
Hibernate search 6 , refresh index after updating entity
不幸的是,我没有找到解决问题的方法,我需要帮助。
我有这样的拖车实体
@Table(name = "A")
@Entity
@Indexed
@Getter
@Setter
@NoArgsConstructor
public class EntityA {
@IndexedEmbedded
@OneToOne(cascade = CascadeType.ALL)
private EntityB b;
}
@Table(name = "B")
@Entity
@Indexed
@Getter
@Setter
@NoArgsConstructor
public class EntityB {
@OneToOne(mappedBy = "b")
private EntityA a;
@KeywordField(name = "text_sort", sortable = Sortable.YES)
@FullTextField(projectable = Projectable.YES)
@Column(nullable = false)
private String text;
}
我为我的 EntityA 做了第一次保存
EntityB entityB = new EntityB();
entityB.setText("text");
EntityA entityA = new EntityA();
entityA.setB(entityB);
entityARespository.save(entityA);
然后我想更新实体B中的字段文本,所以我先从数据库中获取实体A,然后进行更新并保存实体A
EntityA entityA = entityARepository.findById(1L);
entityA.getB().setText("test")
entityBRepository.save(entityA);
然后当我用字符串“test”进行研究时没有找到任何结果,但是用字符串“text”是。这意味着索引没有刷新,但我没有找到问题所在
两种可能的解释:
您对值 test
的更新是在事务之外完成的。确保使用事务,或者如果你真的不想要一个,请在调用 save()
之后调用 entityManager.flush()
(entityBRepository.flush()
和 Spring 数据,我想?) .
您等待更新的时间不够长。 Elasticsearch 是一个近乎实时的平台。这意味着您的更新不会立即可见,而是在定期“刷新”之后可见,默认情况下每秒发生一次。
有关“刷新”概念的更多信息,请参见here。
您可以使用 sync
synchronization strategy 将 Hibernate Search 配置为在每次索引更新后强制刷新,但 Elasticsearch 的性能会很差。我只推荐用于自动化测试,绝对不推荐用于生产。
不幸的是,我没有找到解决问题的方法,我需要帮助。 我有这样的拖车实体
@Table(name = "A")
@Entity
@Indexed
@Getter
@Setter
@NoArgsConstructor
public class EntityA {
@IndexedEmbedded
@OneToOne(cascade = CascadeType.ALL)
private EntityB b;
}
@Table(name = "B")
@Entity
@Indexed
@Getter
@Setter
@NoArgsConstructor
public class EntityB {
@OneToOne(mappedBy = "b")
private EntityA a;
@KeywordField(name = "text_sort", sortable = Sortable.YES)
@FullTextField(projectable = Projectable.YES)
@Column(nullable = false)
private String text;
}
我为我的 EntityA 做了第一次保存
EntityB entityB = new EntityB();
entityB.setText("text");
EntityA entityA = new EntityA();
entityA.setB(entityB);
entityARespository.save(entityA);
然后我想更新实体B中的字段文本,所以我先从数据库中获取实体A,然后进行更新并保存实体A
EntityA entityA = entityARepository.findById(1L);
entityA.getB().setText("test")
entityBRepository.save(entityA);
然后当我用字符串“test”进行研究时没有找到任何结果,但是用字符串“text”是。这意味着索引没有刷新,但我没有找到问题所在
两种可能的解释:
您对值
test
的更新是在事务之外完成的。确保使用事务,或者如果你真的不想要一个,请在调用save()
之后调用entityManager.flush()
(entityBRepository.flush()
和 Spring 数据,我想?) .您等待更新的时间不够长。 Elasticsearch 是一个近乎实时的平台。这意味着您的更新不会立即可见,而是在定期“刷新”之后可见,默认情况下每秒发生一次。
有关“刷新”概念的更多信息,请参见here。
您可以使用
sync
synchronization strategy 将 Hibernate Search 配置为在每次索引更新后强制刷新,但 Elasticsearch 的性能会很差。我只推荐用于自动化测试,绝对不推荐用于生产。