如何在hibernate全文搜索中获得总计数?

时间:2012-03-26 07:51:22

标签: spring hibernate full-text-search hibernate-search

我正在尝试通过以下链接使用hibernate全文: hibernate/search/4.1/reference/en-US/html/getting-started

基本上,它有效,但我想知道如何在执行全文查询时获得总计数,然后我可以告诉用户在这样的查询中会有多少结果和多少页。

以下是代码(使用JPA创建和执行搜索):

EntityManager em = entityManagerFactory.createEntityManager();
FullTextEntityManager fullTextEntityManager = 
org.hibernate.search.jpa.Search.getFullTextEntityManager(em);
em.getTransaction().begin();

// create native Lucene query unsing the query DSL
// alternatively you can write the Lucene query using the Lucene query parser
// or the Lucene programmatic API. The Hibernate Search DSL is recommended though
QueryBuilder qb = fullTextEntityManager.getSearchFactory()
    .buildQueryBuilder().forEntity( Book.class ).get();
org.apache.lucene.search.Query query = qb
  .keyword()
  .onFields("title", "subtitle", "authors.name", "publicationDate")
  .matching("Java rocks!")
  .createQuery();

// wrap Lucene query in a javax.persistence.Query
javax.persistence.Query persistenceQuery = 
    fullTextEntityManager.createFullTextQuery(query, Book.class);
 persistenceQuery.setFirstResult((page - 1) * PAGECOUNT);
    persistenceQuery.setMaxResults(PAGECOUNT);
// execute search
List result = persistenceQuery.getResultList();

em.getTransaction().commit();
em.close();

在SQL中,我可以使用select count(*) from something,但在这里我不知道如何做到这一点。我想每次只获取一页数据,并使用另一个API来获取总数。

4 个答案:

答案 0 :(得分:10)

query.getResultSize(); //return the total number of matching ... regardless of pagination

答案 1 :(得分:3)

我不确定使用Hibernate全文搜索时是否有这种方式。

如果您想知道结果总数,则必须执行完整查询。完全计数后,您可以设置页面限制器并再次执行。

javax.persistence.Query persistenceQuery = 
    fullTextEntityManager.createFullTextQuery(query, Book.class);

int count = persistenceQuery.getResultList().size();

persistenceQuery = 
    fullTextEntityManager.createFullTextQuery(query, Book.class);
persistenceQuery.setFirstResult((page - 1) * PAGECOUNT);
persistenceQuery.setMaxResults(PAGECOUNT);
List result = persistenceQuery.getResultList();

答案 2 :(得分:1)

对于Hibernate(可能是JPA)

public interface FullTextQuery extends Query
换句话说,你需要使用

org.hibernate.search.FullTextQuery query =  fullTextEntityManager.createFullTextQuery(query, Book.class);

而不是

org.hibernate.Query query =  fullTextEntityManager.createFullTextQuery(query, Book.class);

和方法getResultSize()将可用

答案 3 :(得分:0)

直接使用Lucene / Solr 时,我通常会通过搜索*:*来使用hack *,将其设置为返回尽可能少的结果但是 返回"所有" 的总结果计数,然后我继续提取它。基本上它与SELECT count(*) FROM whatever:P

相同

*我说 hack 因为我不确定它是否应该是那样,但它对我有用......