2017-08-01 12 views
0

私はREST API、フロントエンドにはAngular 2、バックエンドにはSpringというWebサイトを作成しています。リクエストの結果を見ると、無限のスクロールがあります。そして、私は全文検索を使って自分の要求と一致するものを探しています。私の質問は、Hibernate Searchで分割されたリクエストを作成する方法です。可能であれば、コードの例をいくつか紹介してください。Hibernate Search Portionedされたリクエスト

私は全文検索に使用するコードの平和

@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 Persistence 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

2番目のページを取得するには、新しい 'FullTextQuery'を作成する必要がありますか、' jpaQuery'オブジェクトを再利用できますか? – nuoritoveri

+0

@nuoritoveri EntityManagerが開いている限り、クエリを再利用できます。 –

関連する問題