【问题标题】:Indexing data in Hibernate Search在 Hibernate Search 中索引数据
【发布时间】:2009-06-01 10:48:43
【问题描述】:

我刚刚开始将 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 分钟才能启动。 我这样做的方式是否正确?

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

【问题讨论】:

    标签: java hibernate-search


    【解决方案1】:

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

    休眠搜索已启用 使用 Hibernate Annotations 时的框 或休眠实体管理器。如果,对于 出于某种原因您需要禁用它, 放 hibernate.search.autoregister_listeners 为假。

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

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

    您需要做的就是用

    注释要索引的实体
    @Indexed(index = "fulltext")
    

    注解,然后对字段进行细粒度的注解,详见用户指南。

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

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

    Hibernate Search and offline text extraction

    寻求解决此问题的解决方案。

    【讨论】:

    • 这个答案特别表明已被接受,因为上面的答案是错误的。在存储实体时,您不应该作为一般程序手动启动索引。
    【解决方案2】:

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

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

    --哈迪

    【讨论】:

    【解决方案3】:

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

        FullTextEntityManager fullTextEntityManager = 
                        Search.getFullTextEntityManager(entityManager);
    
        try {
           fullTextEntityManager.createIndexer().startAndWait();
        } catch (InterruptedException e) {
           // Exception handling
        }
    

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

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

    【讨论】:

    • 请注意,这仅适用于 Hibernate Search 3.2+ 版(请参阅Hibernate Search 3.2: fast index rebuild
    • @KyelJmD 是的。我使用的应用程序是单数据库多租户。还是您指的是多数据库/多模式多租户?那我不确定,你得试试看。
    • @brent777 我指的是多模式多租户。我已经运行了这部分,但它没有工作。
    猜你喜欢
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2014-12-29
    • 2013-06-07
    • 1970-01-01
    相关资源
    最近更新 更多