4

我刚刚开始将 Hibernate Search 与我的 Hibernate 应用程序集成。每次我启动服务器时,都会使用 Hibernate Session 对数据进行索引。

FullTextSession fullTextSession = Search.getFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();

List books = session.createQuery("from Book as book").list();
for (Book book : books) {
    fullTextSession.index(book);
}

tx.commit(); //index is written at commit time     

这很尴尬,服务器需要 10 分钟才能启动。我是否以正确的方式做这件事?

我写了一个调度器,它会定期更新索引。这会自动更新现有的索引条目,还是创建重复的索引?

4

3 回答 3

10

如 Hibernate Search 指南第 3.6.1 节所述,如果您使用注解(现在是默认设置),则默认注册在存储上启动索引的侦听器:

使用 Hibernate Annotations 或 Hibernate EntityManager 时,Hibernate Search 开箱即用。如果由于某种原因需要禁用它,请将 hibernate.search.autoregister_listeners 设置为 false。

有关如何手动打开它们的示例:

 hibConfiguration.setListener("post-update", new FullTextIndexEventListener());
 hibConfiguration.setListener("post-insert", new FullTextIndexEventListener());
 hibConfiguration.setListener("post-delete", new FullTextIndexEventListener());

您需要做的就是用

@Indexed(index = "fulltext")

注释,然后对字段进行细粒度注释,如用户指南中所述。

因此,您不应在存储时手动启动索引,也不应在应用程序启动时重新启动索引,除非您有在启用索引之前已存储的实体。

当您存储一个说有“附件”的对象时,您可能会遇到性能问题,因此您在存储实体的事务的同一范围内对其进行索引。看这里:

Hibernate Search 和离线文本提取

解决此问题的解决方案。

于 2009-09-17T11:16:50.823 回答
1

如果您使用的是 FSDirectoryProvider(这是默认设置),Lucene 索引将持久保存在磁盘上。这意味着不需要在启动时进行索引。如果您有现有的数据库,您当然希望使用 fullTextSession.index() 功能创建一个初始索引。但是,这不应该在应用程序启动时发生。考虑公开某种触发 url 或管理界面。一旦你有了初始索引,我建议使用自动索引。这意味着如果书籍被创建/更新/删除,Lucene 索引会自动更新。默认情况下也应启用自动索引。

我建议您参考在线手册中的自动和手动索引部分 - http://docs.jboss.org/hibernate/stable/search/reference/en/html_single

——哈代

于 2009-06-02T08:02:04.123 回答
0

我目前使用 Hibernate Search 的 JPA 自动索引,它工作得非常好。要最初创建索引,您只需调用以下命令:

    FullTextEntityManager fullTextEntityManager = 
                    Search.getFullTextEntityManager(entityManager);

    try {
       fullTextEntityManager.createIndexer().startAndWait();
    } catch (InterruptedException e) {
       // Exception handling
    }

其中“entityManager”只是一个 javax.persistence.EntityManager。以上将为标记为@Indexed 的所有实体索引所有标记为@Field 的字段。

然后,只要您通过实体管理器进行所有更新等,索引就会自动更新。然后,您可以像往常一样进行搜索,但请确保在每次搜索时重新创建 EntityManager(您可以使用 EntityManagerFactory 来执行此操作)。

于 2011-02-10T03:19:10.633 回答