Tom
Tom

Reputation: 2847

How to get total count in hibernate full text search?

I am trying using hibernate full text by following this link: hibernate/search/4.1/reference/en-US/html/getting-started

Basically, it works, but I want to know how to get total count while I execute a full text query,then I can tell user how many results and how many pages would be in such a query.

Here is the code(Using JPA to create and execute a search):

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();

In SQL, I can use select count(*) from something, but here I don't know how to do that. I want to just fetch one page of data every time and use another API to get total count.

Upvotes: 2

Views: 6054

Answers (4)

Rafael Lins
Rafael Lins

Reputation: 497

When using directly Lucene/Solr, I usually use a hack* by searching for *:*, setting it to return the least possible results BUT that does return the total result count for "everything", and I proceed to extract it. Basically it's the same as the SELECT count(*) FROM whatever :P

*I say hack because I'm not sure if it's supposed to be that way or not, but it works for me...

Upvotes: 0

rdm
rdm

Reputation: 330

For Hibernate(maybe for JPA)

public interface FullTextQuery extends Query

in other words, you need use

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

instead of

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

and method getResultSize() will be available

Upvotes: 1

skrymir1
skrymir1

Reputation: 617

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

Upvotes: 11

magomi
magomi

Reputation: 6685

I'm not sure if there is such a way when using the Hibernate full text search.

If you want to know the total number of results then you have to perform the full query. After you have the full count you can set your page limiter and perform it again.

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();

Upvotes: 3

Related Questions