我们有一个包含大约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表时,索引才应该更新/检查/插入。我们有什么方法可以开箱即用吗?我认为这是一个非常有效的用例。
我们正在使用:
更新21/01/2015 - 17:44 GMT
我做了一些测试,我可以清楚地看到索引 更新/插入不相关的实体时更新。我们正在使用 @ClassBridge(用于提取word / pdf等),我可以看到 呼叫进入ClassBridge实现并调用 document.add(...)。这很奇怪!
答案 0 :(得分:1)
作为文件的作者之一,对措词的道歉不清楚。
Hibernate Search实际上会做什么,只是加载它所需要的数据以保持索引同步,并且只针对那些被索引的实体。
部分更新相应的Lucene索引
应该建议如果没有需要更新的“相应”索引,那就不是这样了。
所以它实际上会像你描述的那样做,而且它甚至更聪明一点:如果更新操作实际上影响了一个或多个索引属性,它只会更新索引。
例如,如果您的索引实体“Person”具有索引属性“name”和非索引属性“email”,则当您更新a时,它将对“Person”索引发出更新操作用于更新“名称”的人员实体,但如果您只是更改“电子邮件”属性,则会跳过该操作。
如果您遇到性能问题,我建议您使用诊断工具获取有关正在发生的事情的信息,而不是试图猜测。