Поиск в спящем режиме с ограничением по критериям возвращает неправильный счет - PullRequest
4 голосов
/ 07 июля 2011

Список результатов идеален, но getResultSize () неверен.

Я ввел код для иллюстрации.

Criteria criteria2 = this.getSession().createCriteria(Film.class);                      

Criterion genre = Restrictions.eq("genreAlias.genreName", details.getSearch().getGenreName());
criteria2.createAlias("genres", "genreAlias", CriteriaSpecification.INNER_JOIN);
criteria2.add(genre);    

criteria2.setMaxResults(details.getMaxRows())
.setFirstResult(details.getStartResult());

FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.createFullTextEntityManager(entityManager);

org.apache.lucene.queryParser.QueryParser parser2 = new QueryParser("title", new StopAnalyzer() );

org.apache.lucene.search.Query luceneQuery2 = parser2.parse( "title:"+details.getSearch()");

FullTextQuery fullTextQuery = fullTextEntityManager.createFullTextQuery( luceneQuery2, Film.class);
fullTextQuery.setCriteriaQuery(criteria2);

fullTextQuery.getResultList()); // Returns the correctly filtered list
fullTextQuery.getResultSize()); // Returns the retsult size without the genre resrtiction

1 Ответ

5 голосов
/ 08 июля 2011

С http://docs.jboss.org/hibernate/search/3.3/api/org/hibernate/search/jpa/FullTextQuery.html

int getResultSize ()

Возвращает количество совпадений для этого поиска. Внимание: количество результатов может немного отличаться от getResultList (). Size (), поскольку getResultList () может не синхронизироваться с базой данных во время запроса.

Вы должны попытаться использовать некоторые из более специализированных запросов, таких как этот:

    Query query = new FuzzyQuery(new Term("title", q));
    FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(query, Film.class);
    int filmCount = fullTextQuery.getResultSize();

и вот как вы делаете запросы на нумерацию страниц (я полагаю, вы неправильно реализовали свою нумерацию страниц):

FullTextQuery hits = Search.getFullTextSession(getSession()).createFullTextQuery(query,      Film.class)
.setFirstResult((pageNumber - 1) * perPageItems).setMaxResults(perPageItems);

Вышеуказанное работает для меня каждый раз. Следует помнить, что результат getResultSize () более оценочный. Я часто использую нумерацию страниц, и я испытал изменение числа между страницами. Таким образом, вы должны сказать «о хххх» результаты.

...