休眠搜索单向关联

时间:2018-12-11 08:01:48

标签: hibernate-search

根据spec,当 @IndexedEmbedded指向实体时,关联必须是定向的,另一端必须使用@ContainedIn进行注释。如果不是这样,当关联的实体更新时,Hibernate Search将无法更新根索引。

我是否正确地假设 direction 一词应该是双向?我确实有我的索引没有更新的问题。我有单向关系,例如订购的人,但订购的人不认识。现在,当我更改顺序时,索引不会更新。

如果将关联更改为双向是没有选择的,那么我仍然必须使用休眠搜索吗?是否可以创建两个单独的索引并合并查询?

1 个答案:

答案 0 :(得分:0)

  

我对方向这个词应该是双向的吗?

是的。我会解决这个错字。

  

如果无法将关联更改为双向,那么我仍然必须使用hibernate-search吗?

如果索引Person并嵌入Order,但是OrderPerson没有反向关联,则Hibernate Search无法检索Person Order更改时必须重新编制索引。

因此,您将必须手动重新编制索引:https://docs.jboss.org/hibernate/search/5.11/reference/en-US/html_single/#manual-index-changes

您可以采用以下两种策略之一:

  1. 简单的方法:定期为所有Person实体重新编制索引,例如每天晚上。
  2. 艰难的道路:Person发生变化时,重新为受影响的Order实体编制索引。基本上,这意味着向您的服务中添加代码,以便每当创建/更新/删除订单时,您都运行查询以检索所有相应人员,并手动为其重新编制索引。

第一个解决方案非常简单,但是有一个很大的缺点,即Person索引最多可能过24小时。取决于您的用例,这可能没事。

第二种解决方案容易出错,基本上您将在进行Hibernate Search的工作。

总而言之,您真的必须问自己,将关联的反面添加到模型中是否会更好?

  

是否可以创建两个单独的索引并合并查询?

从技术上讲,如果您使用的是Lucene集成(而不是Elasticsearch集成),那么可以。

但是:

  • 您将需要高于平均水平的Lucene知识。
  • 您将不得不绕过Hibernate Search API,并且需要编写代码来执行Hibernate Search通常要做的事情。
  • 您将不得不使用实验性的(阅读:不稳定的)Lucene API。
  • 我不确定该如何执行,因为我从未尝试过。

因此,如果您不熟悉Lucene的API,我不建议您这样做。如果您真的想走这条路,这里有一些提示: