Hibernate Search RAMProvider - 不确定它是如何工作的
Hibernate Search RAMProvider - not sure how it works
我正在使用 spring 启动,为了更容易设置(无用户权限操作),我决定使用 RAM 提供程序而不是 FS。谁能证实我的想法。
- 每当我重新启动时,我都会丢失索引。
- 任何时候通过 Hibernate 的东西都会被自动索引,因为在适当的实体上有 @Indexed 注释。
- 如果重新启动,我需要重建索引,因为它使用
丢失了
try {
FullTextEntityManager fullTextEntityManager =
Search.getFullTextEntityManager(entityManager);
fullTextEntityManager.createIndexer().startAndWait();
} catch (InterruptedException e) {
System.out.println(
"An error occurred trying to build the search index: " +
e.toString());
}
- 如果我将使用 FSDirectoryProvider,索引将自动从 FS 重新加载,并且不再需要上面的代码。除非,ORM 实体发生变化。我想我将需要以某种方式手动强制重新索引。
是否有一些可以依赖的 DBDirectory 实现?在这种情况下,索引文件被加载到 RAM 或索引的每个更新分别写入数据库?
你所有的假设几乎都是正确的。
内存中索引在两种情况下丢失:
- JVM 关闭
- 在应用程序仍在运行时重新打开索引 运行
只有在以下情况下您才需要重新索引您的实体:
- 您更改了在索引或搜索期间分析或标记实体的方式
- 您在索引中添加或删除了实体属性
- 您更改了影响索引的实体之间的关系
在撰写本文时,还没有基于数据库的目录。过去我试图适应Compass JdbcDirectory
。不幸的是,除了概念的工作证明之外,我没有时间走得更远。
自 2011 年以来在项目跟踪器中有一个开放 issues。看来在不久的将来,Hibernate Search 中将不会正式支持数据库驱动的目录。
请记住,内存中的索引仅适用于 small data:
Warning: This class is not intended to work with huge indexes.
Everything beyond several hundred megabytes will waste resources (GC
cycles), because it uses an internal buffer size of 1024 bytes,
producing millions of byte[1024] arrays. This class is optimized for
small memory-resident indexes. It also has bad concurrency on
multithreaded environments.
您可以使用 Infinispan 目录作为替代方案,将内容保存在内存中,但在持久存储上有一个副本。
Infinispan 项目同时提供了
- Apache Lucene Directory 实现
- Hibernate Search DirectoryProvider
Infinispan 旨在积极地在内存中缓存数据,但有几个选项可以通过在其配置中启用 CacheStore 将此类数据卸载到永久存储。
在众多 CacheStore 实现中,您可能对以下内容感兴趣:
- FSCacheStore which stores stuff in filesystem
- JDBC based CacheStore 通常是 Hibernate 的一个很好的组合。
还有很多选择,比如连接到云存储、流行的 NoSQL 数据库等。Infinispan 还支持跨节点的实时复制,因此您在 Hibernate Search 中索引存储的选择几乎是无限的。
我正在使用 spring 启动,为了更容易设置(无用户权限操作),我决定使用 RAM 提供程序而不是 FS。谁能证实我的想法。
- 每当我重新启动时,我都会丢失索引。
- 任何时候通过 Hibernate 的东西都会被自动索引,因为在适当的实体上有 @Indexed 注释。
- 如果重新启动,我需要重建索引,因为它使用 丢失了
try {
FullTextEntityManager fullTextEntityManager =
Search.getFullTextEntityManager(entityManager);
fullTextEntityManager.createIndexer().startAndWait();
} catch (InterruptedException e) {
System.out.println(
"An error occurred trying to build the search index: " +
e.toString());
}
- 如果我将使用 FSDirectoryProvider,索引将自动从 FS 重新加载,并且不再需要上面的代码。除非,ORM 实体发生变化。我想我将需要以某种方式手动强制重新索引。
是否有一些可以依赖的 DBDirectory 实现?在这种情况下,索引文件被加载到 RAM 或索引的每个更新分别写入数据库?
你所有的假设几乎都是正确的。
内存中索引在两种情况下丢失:
- JVM 关闭
- 在应用程序仍在运行时重新打开索引 运行
只有在以下情况下您才需要重新索引您的实体:
- 您更改了在索引或搜索期间分析或标记实体的方式
- 您在索引中添加或删除了实体属性
- 您更改了影响索引的实体之间的关系
在撰写本文时,还没有基于数据库的目录。过去我试图适应Compass JdbcDirectory
。不幸的是,除了概念的工作证明之外,我没有时间走得更远。
自 2011 年以来在项目跟踪器中有一个开放 issues。看来在不久的将来,Hibernate Search 中将不会正式支持数据库驱动的目录。
请记住,内存中的索引仅适用于 small data:
Warning: This class is not intended to work with huge indexes. Everything beyond several hundred megabytes will waste resources (GC cycles), because it uses an internal buffer size of 1024 bytes, producing millions of byte[1024] arrays. This class is optimized for small memory-resident indexes. It also has bad concurrency on multithreaded environments.
您可以使用 Infinispan 目录作为替代方案,将内容保存在内存中,但在持久存储上有一个副本。
Infinispan 项目同时提供了
- Apache Lucene Directory 实现
- Hibernate Search DirectoryProvider
Infinispan 旨在积极地在内存中缓存数据,但有几个选项可以通过在其配置中启用 CacheStore 将此类数据卸载到永久存储。
在众多 CacheStore 实现中,您可能对以下内容感兴趣:
- FSCacheStore which stores stuff in filesystem
- JDBC based CacheStore 通常是 Hibernate 的一个很好的组合。
还有很多选择,比如连接到云存储、流行的 NoSQL 数据库等。Infinispan 还支持跨节点的实时复制,因此您在 Hibernate Search 中索引存储的选择几乎是无限的。