Hibernate自动索引替代方案

时间:2015-01-20 16:16:48

标签: hibernate lucene hibernate-search

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

问题在于,只要在任何表上存在crud操作,Hibernate就会对这两个cms表进行一些查询(我们认为这会降低操作速度)。我们从休眠documentation中了解到这一点:

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

更新21/01/2015 - 17:44 GMT

  

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

1 个答案:

答案 0 :(得分:1)

作为文件的作者之一,对措词的道歉不清楚。

Hibernate Search实际上会做什么,只是加载它所需要的数据以保持索引同步,并且只针对那些被索引的实体。

部分
  

更新相应的Lucene索引

应该建议如果没有需要更新的“相应”索引,那就不是这样了。

所以它实际上会像你描述的那样做,而且它甚至更聪明一点:如果更新操作实际上影响了一个或多个索引属性,它只会更新索引。

例如,如果您的索引实体“Person”具有索引属性“name”和非索引属性“email”,则当您更新a时,它将对“Person”索引发出更新操作用于更新“名称”的人员实体,但如果您只是更改“电子邮件”属性,则会跳过该操作。

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