【问题标题】:Hibernate Automatic indexing alternativeHibernate 自动索引替代
【发布时间】:2015-01-20 16:16:47
【问题描述】:

我们有一个包含大约 130 个表的 Oracle 数据库。其中,只有两个表用于全文搜索(它们是 cms 表)。这些表使用 Hibernate/Lucene 注释正确配置。

问题在于,每当对任何表进行 crud 操作时,Hibernate 都会对这两个 cms 表进行一些查询(我们认为这会减慢操作速度)。我们从hibernatedocumentation了解到这一点:

3.1.2. Automatic indexing

By default, every time an object is inserted, updated or deleted through Hibernate, Hibernate Search updates the according Lucene index....

我们也知道可以通过使用手动索引 (Doc link) 来避免这种情况。但是我们不想手动使用索引(因为我们不想通过代码这样做)。

我们喜欢自动索引,但我们需要以这样一种方式配置 hibernate,即只有在 两个 cms 表中的任何一个被插入/更新/删除时,索引才应该更新/检查/插入。有什么方法可以开箱即用吗?我认为这是一个非常有效的用例。

我们正在使用:

  • hibernate.core.version - 4.2.15.Final
  • hibernate.search.version - 4.3.0.Final
  • lucene-core - 3.6.2

2015 年 1 月 21 日更新 - 格林威治标准时间 17:44

我做了更多的测试,我可以清楚地看到索引 当更新/插入不相关的实体时更新。我们正在使用 @ClassBridge (用于提取 word/pdf 等),我可以看到 call 进入 ClassBridge 实现并调用 文档.add(...)。这很奇怪!

【问题讨论】:

标签: hibernate lucene hibernate-search


【解决方案1】:

作为文档的作者之一,对于措辞不清楚,我们深表歉意。

Hibernate Search 实际上会做的只是加载它严格需要的数据以保持索引同步,并且只加载那些被索引的实体。部分

更新相应的 Lucene 索引

应该建议如果没有需要更新的“according”索引,它就不会这样做。

因此它实际上会按照您的描述进行操作,而且它甚至更聪明一点:它只会在更新操作实际上影响一个或多个索引属性时更新索引。

例如,如果您有一个带有索引属性“name”和非索引属性“email”的索引实体“Person”,当您更新一个“Person”索引时,它将发出一个更新操作更新“姓名”的人员实体,但如果您只更改“电子邮件”属性,它将跳过该操作。

如果您遇到性能问题,我建议您使用诊断工具来获取有关正在发生的事情的信息,而不是试图猜测。

【讨论】:

  • 是否进行了更多测试,即使更新了另一个表(除了 cms),我也可以确认索引正在更新?请参阅我的更新 21/01/2015 - 17:44 GMT
  • 您的自定义 ClassBridge 实现可能正在进行一些更改。如果没有,请在 Hibernate 论坛或 JIRA 上发布更多详细信息。我们可能需要查看实体和桥的实现。
  • 问题出在实体映射上。 cms 的一对一映射没有延迟加载。一旦纠正,问题就消失了。谢谢@Sanne。
  • 很高兴听到,感谢您告诉我问题已解决!
猜你喜欢
  • 2012-05-26
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多