如何在没有底层数据库的情况下使用Hibernate搜索?

如何在没有底层数据库的情况下使用Hibernate搜索?,hibernate,search,lucene,hibernate-search,Hibernate,Search,Lucene,Hibernate Search,是否可以在不使用hibernate core的情况下使用hibernate搜索功能 我想创建一个带有标准Hibernate搜索注释的Bean,并手动存储所有内容以进行测试(我不想为测试创建Hibernate表) 对于要用@Indexed注释的类,我需要它是一个@Entity,但是由于这个原因,我得到了一个错误,因为我没有为这个类指定我的数据库内容 我的问题是: 如何仅对Lucene管理使用Hibernate搜索?最终,Hibernate需要知道数据库配置。。当您注意到hibernate日志时,h

是否可以在不使用hibernate core的情况下使用hibernate搜索功能

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

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

我的问题是:


如何仅对Lucene管理使用Hibernate搜索?

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


奶酪

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

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

实际上,您可以使用Hibernate独立搜索,而不使用Hibernate ORM。但是,您必须实现几个SPI合同。这很麻烦,但也有可能。事实上,Infinispan查询(Infinispan的查询功能-)正是这样做的。它使用Hibernate搜索引擎,不包含ORM部分。搜索团队正在努力使不使用ORM的搜索变得更容易。关注即将发布的版本

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

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

使用所需的所有信息创建一个虚拟实体类,并按如下方式操作(示例来自我的代码和建议类)

Transaction tx=fullTextSession.beginTransaction();
fullTextSession.purgeAll(Suggest.class);
SuggestionFinder SuggestionFinder=上下文
.getBean(SuggestionFinder.class);
List todelite=new ArrayList();
int i=0;
for(Suggest sugg:suggestionFinder.findSuggestionsForIndex()){
fullTextSession.save(sugg);
toDelete.add(sugg);
fullTextSession.index(sugg);
如果(i++%1000==0){
fullTextSession.flushToIndexes();
对于(建议当前:toDelete){
fullTextSession.delete(cur);
}
toDelete.clear();
}
}
fullTextSession.flushToIndexes();
对于(建议当前:toDelete){
fullTextSession.delete(cur);
}
toDelete.clear();
fullTextSession.getSearchFactory().optimize(Suggest.class);
tx.commit();
编辑:

我已经实现了Hibernate搜索独立版本:


我希望您在这里考虑hibernate缓存机制。
        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();