【问题标题】:How to use Hibernate Search without an underlying database?如何在没有底层数据库的情况下使用 Hibernate Search?
【发布时间】:2013-12-03 06:39:33
【问题描述】:

是否可以在不使用休眠核心的情况下使用休眠搜索功能?

我想创建一个带有标准 Hibernate-Search 注释的 Bean,并手动存储所有内容以进行测试(我不想创建 Hibernate 表进行测试)。

对于一个用@Indexed 注释的类,我需要它是一个@Entity,但是因为我没有为这个类指定我的数据库内容,所以我得到了一个错误。

我的问题是:

如何仅将 Hibernate Search 用于 Lucene 管理?

【问题讨论】:

  • 我希望你在这里考虑休眠缓存机制。

标签: hibernate search lucene hibernate-search


【解决方案1】:

最终你的hibernate需要知道数据库配置。当你注意到hibernate日志时,Hibernate引擎将首先注册类型,作为第二步它会寻找hibernate配置属性,它会在接下来的步骤中解析和验证。我的这里的重点是hibernate必须被告知数据库信息...顺便说一句,您还可以发布错误详细信息以获得进一步的帮助..

干杯!

【讨论】:

    【解决方案2】:

    如果其他一切都失败了,您可以使用in-memory 中的one databases。它们会在您运行测试后自毁。

    【讨论】:

      【解决方案3】:

      我认为这里的问题是您的最终目标是什么?您想在没有 Hibernate ORM 的生产环境中使用 Hibernate Search,还是只是在寻找一些测试解决方案?

      实际上,您可以在没有 Hibernate ORM 的情况下独立使用 Hibernate Search。但是,您必须实施多个 SPI 合同。这很麻烦,但可能。事实上,Infinispan Query(Infinispan 的查询功能 - https://github.com/infinispan/infinispan/tree/master/query)正是这样做的。它使用没有 ORM 部分的 Hibernate Search 引擎。 Search 团队正在努力使在没有 ORM 的情况下使用 Search 变得更加容易。密切关注即将发布的版本。

      如果您只是在寻找某种方法来测试 Hibernate Search + ORM,那么您最好使用内存数据库。在这种情况下,这是进行单元测试的最简单方法。

      【讨论】:

        【解决方案4】:

        这就是它的完成方式(如果您有一个数据库,但您不想将索引的内容存储到其中):

        使用您需要的所有信息创建一个虚拟实体类,然后像这样(我的代码中带有 Suggest 类的示例)

                Transaction tx = fullTextSession.beginTransaction();
        
                fullTextSession.purgeAll(Suggest.class);
        
                SuggestionFinder suggestionFinder = context
                        .getBean(SuggestionFinder.class);
                List<Suggest> toDelete = new ArrayList<>();
                int i = 0;
                for (Suggest sugg : suggestionFinder.findSuggestionsForIndex()) {
                    fullTextSession.save(sugg);
                    toDelete.add(sugg);
                    fullTextSession.index(sugg);
                    if (i++ % 1000 == 0) {
                        fullTextSession.flushToIndexes();
                        for (Suggest cur : toDelete) {
                            fullTextSession.delete(cur);
                        }
                        toDelete.clear();
                    }
                }
                fullTextSession.flushToIndexes();
                for (Suggest cur : toDelete) {
                    fullTextSession.delete(cur);
                }
                toDelete.clear();
        
                fullTextSession.getSearchFactory().optimize(Suggest.class);
        
                tx.commit();
        

        编辑:

        我已经实现了一个 Hibernate-Search Standalone 版本:

        https://github.com/Hotware/Hibernate-Search-JPA/tree/master/hibernate-search-standalone

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-27
          • 1970-01-01
          • 2023-03-10
          相关资源
          最近更新 更多