Как получить общий счет в спящем полнотекстовом поиске? - PullRequest
2 голосов
/ 26 марта 2012

Я пытаюсь использовать спящий полный текст, перейдя по этой ссылке: спящий режим / поиск / 4,1 / ссылки / EN-US / html / получение стартером

По сути, это работает, но я хочу знать, как получить общее количество, пока я выполняю полнотекстовый запрос, затем я могу сообщить пользователю, сколько результатов и сколько страниц будет в таком запросе.

Вот код (Использование 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 ]

10 голосов
/ 27 июля 2012
query.getResultSize(); //return the total number of matching ... regardless of pagination
3 голосов
/ 26 марта 2012

Я не уверен, есть ли такой способ при использовании полнотекстового поиска 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();
1 голос
/ 09 июля 2013

Для 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 () будет доступен

0 голосов
/ 21 сентября 2014

При непосредственном использовании Lucene / Solr я обычно использую хак *, выполняя поиск *:*, устанавливая его так, чтобы он возвращал наименьшие возможные результаты, НО действительно возвращает общий результат для "всего" , и я приступаю к его извлечению. По сути это то же самое, что и SELECT count(*) FROM whatever: P

* Я говорю взломать , потому что я не уверен, должно ли это быть так или нет, но это работает для меня ...

...