Hibernate Search RAMProvider - 不确定它是如何工作的

时间:2016-02-11 07:26:46

标签: spring lucene spring-boot hibernate-search

我正在使用spring boot并且为了更容易设置(没有用户权限操作)我决定使用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还是索引的每次更新都单独写入DB?

2 个答案:

答案 0 :(得分:2)

您的所有假设几乎都是正确的。

在两种情况下,内存索引会丢失:

  • JVM关闭
  • 索引在应用程序仍在运行时重新打开

只有在以下情况下才需要重新编制实体索引:

  • 您改变了在索引或搜索过程中分析或标记实体的方式
  • 您在索引中添加或删除了实体属性
  • 您更改了影响索引的实体之间的关系

在写作时,没有基于数据库的目录。在过去,我尝试调整Compass JdbcDirectory。不幸的是,我从来没有时间比工作的概念验证更进一步。

项目跟踪器自2011年起开放issues。似乎在不久的将来,Hibernate Search中的数据库驱动目录不会得到官方支持。

请记住,内存索引仅适用于small data

  

警告:此类不适用于大型索引。   超过几百兆的所有东西都会浪费资源(GC   循环),因为它使用1024字节的内部缓冲区,   产生数百万字节[1024]数组。这个类是优化的   小内存驻留索引。它还具有错误的并发性   多线程环境。

答案 1 :(得分:2)

您可以使用Infinispan目录作为替代方法,将内容保留在内存中,但在持久存储上具有副本。

Infinispan项目同时提供了

  • Apache Lucene Directory实现
  • 一个Hibernate Search DirectoryProvider

A pointer to the source code

Infinispan旨在积极地将数据缓存在内存中,但有几个选项可通过在其配置中启用CacheStore将此类数据卸载到永久存储。

在众多CacheStore实现中,您可能会对以下内容感兴趣:

还有更多选择,例如连接到云存储,流行的NoSQL数据库等.Infinispan还支持跨节点的实时复制,因此您在Hibernate Search中的索引存储选项几乎是无限的。