Hibernate Search

常见问题解答

索引

索引目录中没有创建文件

Hibernate Search 不会在现有目录中创建新索引。

基本 Lucene 索引文件是在框架启动时创建的,但现有目录不会被修改。删除目录:框架将在启动时创建它并构建基本索引结构。自 3.1 版本起,它会自动检测现有目录中的索引。

在集群中,我的节点似乎无法看到彼此的索引更改

问题可能会有很大差异,但最有可能的是配置问题。请仔细查看参考文档中的配置章节,尤其是关于 架构 的章节。

在多台服务器上运行应用程序时,您需要同时设置适当的后端(将更改委托给主节点)和 DirectoryProvider(存储索引)。

我收到一个 IndexFormatTooOldException,我该怎么办?

我们尽量减少您需要重新索引数据的次数。这通常发生在您升级到新的 Hibernate Search 主要版本时。主要原因有两个:

  • Lucene 强制使用新的索引格式

  • 我们决定默认情况下以更有效的方式索引给定属性

最好阅读我们的 迁移指南,其中详细说明了可能影响您的 API 和索引结构更改。

最简单的方法是重新生成索引结构(例如使用 Mass Indexer)。如果您真的不能这样做,请尝试

  • 使用 Lucene 的 IndexUpgrader

  • 在默认行为发生变化的情况下(请查看迁移指南),仔细更新 Hibernate Search 映射。

查询

我可以混合使用 HQL 和 Lucene 查询吗?

这是不可能的,因为没有办法在不迭代至少一个结果的情况下交叉两个查询的结果。您可以考虑在 Lucene 索引中添加其他字段,然后查看参考文档中的过滤器。

在检索结果和大小的时候避免使用两个查询

如果您计划返回匹配结果的数量和结果列表,您应该按照以下顺序调用方法

fullTextQuery.list(); //or iterate or scroll
fullTextQuery.getResultSize();

这将执行单个 Lucene 查询而不是两个查询,并且速度更快。

配置

我收到一条错误消息,说事件监听器未配置

完整的错误消息看起来像这样

Caused by: org.hibernate.HibernateException: Hibernate Search Event listeners not configured, please check the reference documentation and the application's hibernate.cfg.xml
   at org.hibernate.search.util.ContextHelper.getSearchFactoryBySFI(ContextHelper.java:32)

此错误有几种可能的原因。

  • 您没有使用 Hibernate 注释,在这种情况下,事件监听器必须手动配置(另请参见在线文档中的事件监听器配置)。

    <hibernate-configuration>
         <session-factory>
            <event type="post-update"/>
                <listener class="org.hibernate.search.event.FullTextIndexEventListener"/>
            </event>
            <event type="post-insert"/>
                <listener class="org.hibernate.search.event.FullTextIndexEventListener"/>
            </event>
            <event type="post-delete"/>
                <listener class="org.hibernate.search.event.FullTextIndexEventListener"/>
            </event>
        </session-factory>
    </hibernate-configuration>
    其他版本需要更多事件监听器,而最新版本根本不需要任何监听器:请参考与您使用的版本相关的文档。
  • 您正在使用错误版本的 Hibernate 注释/搜索。

    Hibernate 注释尝试在启动时检测搜索并在找到它们的情况下配置事件监听器。但这要求您具有正确版本的依赖项。查看兼容性矩阵,了解 jar 文件的正确组合。如果您使用的是与 Hibernate Search 发行版一起提供的 jar 文件,请确保您确实安装了正确的 jar 文件,并且它们确实被使用。一些容器可能有一个共享的 lib 目录,其中包含所需库的旧版本。检查日志文件。每个 Hibernate 产品在启动时都会报告其版本。

  • 如果您确定您正在使用正确版本的注释和搜索,并且您仍然遇到此异常,可能是您有一个自定义类加载配置,它阻止注释定位特定于搜索的事件监听器。如果是这种情况,请尝试手动配置。

如何开始使用搜索原型?

使用以下命令,为 archetypeVersion 指定最新的 Hibernate Search 版本(或您选择的版本)。

mvn archetype:generate -DarchetypeGroupId=org.hibernate -DarchetypeArtifactId=hibernate-search-quickstart -DarchetypeVersion=4.0.0.Final -DarchetypeRepository=http://repository.jboss.org/nexus/content/groups/public-jboss/

您需要指定组 ID、构件 ID 和版本。创建示例项目后,您可以检查源代码并运行例如 mvn test。

要获取存储库中所有可用原型的完整列表,请运行

mvn archetype:generate -DarchetypeRepository=http://repository.jboss.org/nexus/content/groups/public-jboss

集成

JBoss AS 4.2 中的 NoSuchMethodError

错误是:Caused by: java.lang.NoSuchMethodError: org.hibernate.search.FullTextSession.createFullTextQuery(Lorg/apache/lucene/search/Query;[Ljava/lang/Class;)Lorg/hibernate/search/FullTextQuery;

Hibernate Search 3.0 需要 Hibernate 注释 3.3.x,而 JBoss AS 4.2 附带 3.2.x。替换以下 jar 文件

  • hibernate-annotations.jar (3.3.x for Search 3.0)

  • hibernate-validator.jar (3.0.x for Search 3.0)

  • hibernate-entitymanager.jar (3.3.x for Search 3.0)

  • hibernate-commons-annotations.jar (3.0.x for Search 3.0)

[JBOSS_HOME]/server/[myconfig]/lib 中。然后将 Hibernate Search 和 Lucene JAR 放置到您的 EAR 或 WAR 中。

我正在使用 Spring,并且索引没有在事务提交时更新

另请参阅 spring 集成,并特别检查您是否正在使用正确的交易管理器

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">

搜索使用后台线程来管理索引;当您关闭 Hibernate 的 SessionFactory 时,它们将被优雅地关闭。始终建议关闭 SessionFactory;当使用 Search 时,这是必须的,否则您的应用程序可能永远不会终止。

sessionFactory.close();

当使用 exclusive_index_use=true 时,还需要正确清除索引锁;请注意,此选项从 Hibernate Search 4.0 开始默认启用。

返回顶部