Hibernate Search рассчитывает напрямую вместо обычного запроса с Lucene и Elasticsearch - PullRequest
2 голосов
/ 21 мая 2019

Положение: Я использую индексы Apache-Lucene с Hibernate Search в своем приложении Java. Для нумерации страниц я хочу подсчитать все совпадения запроса по одному индексу.

Сейчас я оцениваю переход от Apache-Lucene к Elasticsearch (ES) в качестве бэкэнда индекса. Поиск в Hibernate по-прежнему должен обеспечивать абстракцию, как и в Apache-Lucene.

Вопрос: При использовании fullTextQuery.getResultSize () кажется, что запрос выполнен и весь результат сохранен. Размер вычисляется впоследствии по полученному результату. Похоже, что это имеет место как в Lucene, так и в реализации ES.

В ES для этой цели есть _count API . Можно ли использовать этот API через Hibernate Search? Одной из проблем при получении всех документов в индексе является ограничение размера окна результатов ES. Я ожидаю, что производительность также улучшится при использовании _count API.

Существует ли функция подсчета для Apache-Lucene через Hibernate Search?

Спасибо.

1 Ответ

1 голос
/ 21 мая 2019

В Hibernate Search 5 вы должны установить максимальный размер результата равным 0, чтобы Hibernate Search ничего не загружал:

FullTextQuery fullTextQuery = session.createFullTextQuery( luceneQuery, ScientificArticle.class );
fullTextQuery.setMaxResults(0);
int count = fullTextQuery.getResultSize();

setMaxResults() не влияет на значение, возвращаемое getResultSize().

Это поведение немного странное, само собой разумеющееся, но оно останется таким же в Search 5 по историческим причинам, связанным с тем, как кэшируются результаты. В Hibernate Search 6 мы изменим поведение, и вам не придется беспокоиться о вызове setMaxResults() просто для получения размера результата.

...