我正在使用建立在 Lucene 索引之上的 Hibernate Search。如果针对数据库表创建索引,则返回结果的性能会很好。
我的问题是,一旦创建了索引,如果我们查询结果,Hibernate Search 会使用创建的索引从原始数据库表中获取结果吗?还是不需要访问数据库来获取结果?
谢谢!
最佳答案
除非你使用 Projections索引仅用于识别与查询匹配的主键集,然后用于从数据库加载实体。
这有很多很好的理由:
- 正如您所指出的,我们不会将所有数据都存储在索引中:索引越大,索引越慢
- 将所有需要的元数据添加到索引会使索引成为一项非常昂贵的操作
- 从索引中提取值根本不高效:它擅长查询,仅此而已
- 关系型数据库非常擅长通过主键加载数据
- 如果你的数据库不够好,二级缓存非常适合通过主键加载
- 通过从数据库加载,我们保证了一致性,尤其是异步索引
- 通过从数据库加载,您可以让实体参与事务和隔离
也就是说,如果您不需要完全托管的实体,您可以使用投影来加载您注释为 Stored.YES 的字段。一种常见的模式是使用投影提供匹配项预览,然后在用户单击以获取详细信息时加载与该结果匹配的完整实体。
关于java - Hibernate Search(Lucene 索引)如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14560729/