实施Hibernate Search

时间:2017-02-01 09:28:25

标签: java hibernate spring-data-jpa hibernate-criteria hibernate-search

对于我的Web应用程序,我必须实现全文搜索 - 因为我已经在使用Spring Data JPA的Hibernate(在Spring Boot之上)我决定实现Hibernate Search以查看全文Lucene查询。一切都按预期工作,但在实施Hibernate Search后,我开始收到警告:

  

不推荐使用Hibernate的旧版org.hibernate.Criteria API;使用   而是JPA javax.persistence.criteria.CriteriaQuery

我没有对我的Hibernate Search查询使用Criteria API(因为Hibernate Search文档不鼓励它),我的查询代码基本上如下:

import org.apache.lucene.search.Query;
import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.jpa.FullTextQuery;
import org.hibernate.search.jpa.Search;
import org.hibernate.search.query.dsl.BooleanJunction;
import org.hibernate.search.query.dsl.QueryBuilder;

...

@Override
@Transactional
public List<Picture> fullTextSearchByCriteria(List<SearchCriteria> criteria, String pageString) {
    final FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
    final QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Picture.class).get();
    final Query luceneQuery = buildFromCriteria(queryBuilder, criteria);
    final FullTextQuery jpaQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, Picture.class);

    /* some fine tunning here with calls to .setFirstResult(), .setMaxResults() and 
       .getResultSize() for pagination. It's used for page wrapper that I omitted here for simplicity sake */

    return jpaQuery.getResultList()
}

buildFromCriteria(queryBuilder, criteria)是一个构建布尔结点的方法(同样SearchCriteria类只是一个普通的POJO,没有什么有趣的)。该方法如下所示:

@Transactional
private Query buildFromCriteria(QueryBuilder queryBuilder, List<SearchCriteria> criteria) {
    if (criteria == null)
        return queryBuilder.all().createQuery();

    BooleanJunction<BooleanJunction> junction = queryBuilder.bool();
    for (SearchCriteria c : criteria) {
        junction.must(
                queryBuilder
                        .keyword()
                        .onField(c.getField())
                        .matching(c.getValue())
                        .createQuery()
        );
    }
    return junction.createQuery();
}

此全文搜索的每次使用都会导致Criteria API弃用警告。

它是否在引擎盖下使用弃用的Criteria API?如果是这样,为什么Hibernate Search会使用Hibernate弃用的API?实际上,当我打电话给

时,我也会在应用程序启动时收到一些弃用警告
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
fullTextEntityManager.createIndexer().startAndWait();

用于初始索引。

注意:我在应用程序的其他部分使用Springs Specification,我希望可以使用Criteria API,但是在使用它时我没有得到弃用警告,并且在Hibernate之前也没有得到任何警告搜索已添加。

EntityManager是通过@PersistanceContext注入获得的。

如果可能的话,我想摆脱不推荐使用的API用法,但我不明白在这种情况下使用Criteria API的地方,以及是否可以将其更改为JPA CriteriaQuery(因为我没有明确地使用它) )。

我对我认为可能很重要的版本的依赖:

  • hibernate-core:5.2.5.Final
  • hibernate-search-orm:5.7.0.Beta2

还为分析仪使用了一些额外的依赖项:

  • solr-analysis-extras:5.5.2
  • lucene-analyzers-stempel:5.5.2

1 个答案:

答案 0 :(得分:3)

将Hibernate Search转换为Hibernate ORM的最新更改是一项复杂的工作。 您正在点击HSEARCH-2381