2

我正在使用基于 Lucene 索引构建的 Hibernate Search。如果针对数据库表创建索引,则返回结果的性能会很好。

我的问题是,一旦创建了索引,如果我们查询结果,Hibernate Search 是否使用创建的索引从原始数据库表中获取结果?还是不需要访问数据库来获取结果?

谢谢!

4

2 回答 2

5

除非您使用Projections,否则索引仅用于识别与查询匹配的主键集,然后使用这些索引从数据库加载实体。

这有很多很好的理由:

  • 正如您所指出的,我们不会将所有数据存储在索引中:更大的索引是更慢的索引
  • 将所有需要的元数据添加到索引将使索引操作非常昂贵
  • 从索引中提取值根本没有效率:它擅长查询,仅此而已
  • 关系数据库非常擅长按主键加载数据
  • 如果你的数据库不够好,二级缓存非常适合通过主键加载
  • 通过从数据库加载,我们保证了一致性,尤其是异步索引
  • 通过从数据库加载,您有实体参与事务和隔离

也就是说,如果您不需要完全托管的实体,您可以使用 Projections 来加载您注释为 Stored.YES 的字段。一种常见的模式是使用投影提供匹配的预览,然后当用户单击详细信息以加载与该结果匹配的完整实体时。

于 2013-01-28T23:15:07.330 回答
1

默认情况下,每次通过 Hibernate 插入、更新或删除对象时,Hibernate Search 都会根据文档更新相应的 Lucene 索引

因此,进一步的搜索将仅通过 lucene 索引产生数据。

另一个解释索引如何工作的问题

于 2013-01-28T11:18:00.020 回答