2017-08-01 63 views
0

我正在创建一个REST API,Angular 2在前端和Spring在后端的Web站点。当我查看请求结果时,有无限滚动。我正在使用全文搜索来查找我的请求的匹配项。我的问题是如何在我的Hibernate搜索中创建分段请求?如果可能,请介绍一些代码示例。休眠搜索分区请求

的代码和平,我使用的全文检索

@Repository 
@Transactional 
public class HibernateSearch { 
@PersistenceContext 
    private EntityManager entityManager; 

    public List<Manual> fulltextSearching(String keyword){ 
    if(keyword.equals("")) return Collections.emptyList(); 
    FullTextEntityManager fullTextEntityManager = 
      org.hibernate.search.jpa.Search.getFullTextEntityManager(entityManager); 
    QueryBuilder qb = fullTextEntityManager.getSearchFactory() 
      .buildQueryBuilder().forEntity(Manual.class).get(); 
    javax.persistence.Query jpaQuery = 
      fullTextEntityManager.createFullTextQuery(createQuery(qb, keyword), Manual.class); 
    @SuppressWarnings("unchecked") 
    List<Manual> result = jpaQuery.getResultList(); 
    return result; 
    } 

private org.apache.lucene.search.Query createQuery(QueryBuilder qb, String keyword){ 
    return qb 
      .keyword() 
      .onFields("name", "introduction", "user.username", "tags.name") 
      .matching(keyword) 
      .createQuery(); 
    } 


} 

回答

0

使用分页,由Java持久性API提供:

@Repository 
@Transactional 
public class HibernateSearch { 
@PersistenceContext 
    private EntityManager entityManager; 

    public List<Manual> fulltextSearching(String keyword, int offset, int limit){ 
    if(keyword.equals("")) return Collections.emptyList(); 
    FullTextEntityManager fullTextEntityManager = 
      org.hibernate.search.jpa.Search.getFullTextEntityManager(entityManager); 
    QueryBuilder qb = fullTextEntityManager.getSearchFactory() 
      .buildQueryBuilder().forEntity(Manual.class).get(); 
    javax.persistence.Query jpaQuery = 
      fullTextEntityManager.createFullTextQuery(createQuery(qb, keyword), Manual.class); 

    // ADDED CODE HERE 
    jpaQuery.setFirstResult(offset); 
    jpaQuery.setMaxResults(limit); 

    @SuppressWarnings("unchecked") 
    List<Manual> result = jpaQuery.getResultList(); 
    return result; 
    } 

private org.apache.lucene.search.Query createQuery(QueryBuilder qb, String keyword){ 
    return qb 
      .keyword() 
      .onFields("name", "introduction", "user.username", "tags.name") 
      .matching(keyword) 
      .createQuery(); 
    } 


} 

结果默认由相关性排序,所以没有必要添加排序。

+0

谢谢,它对我很有用 –

+0

要获得第二页,你需要创建一个新的'FullTextQuery'还是可以重用'jpaQuery'对象? – nuoritoveri

+0

@nuoritoveri只要您的EntityManager打开,您可以重复使用该查询。 –