Запрос с помощью Hibernate Search и получение всех элементов без разбиения на страницы - PullRequest
0 голосов
/ 14 июля 2020

Я использую Hibernate Search в моем проекте Spring Boot. В большинстве случаев это идеальное решение для моих нужд, за исключением одного случая, когда мне нужно получить все элементы, выбранные с помощью полнотекстового поискового запроса.

Есть ли шанс избежать Hibernate Search / Lucene paging при использовании Hibernate Поиск? Что-то похожее на Pageable.unpaged()? Я не хочу устанавливать размер страницы на Integer.MAX_VALUE, так как это своего рода взлом. Но если лучшего решения нет, придется использовать именно так.

1 Ответ

1 голос
/ 15 июля 2020

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

Если вы действительно хотите сделать это в любом случае, вы можете получить все результаты, просто не установив ограничения для вашего запроса:

Hibernate Search 5:

Session session = /* ... */;
FullTextSession fullTextSession = Search.getFullTextSession( session );
Query luceneQuery = /* ... */;
FullTextQuery ftQuery = fullTextSession.createFullTextQuery( luceneQuery, MyEntity.class );
List<MyEntity> hits = ftQuery.list();

Hibernate Search 6:

Session session = /* ... */;
List<MyEntity> = Search.session( session ).search( MyEntity.class )
        .where( f -> /* ... */ )
        .fetchAllHits();

Но во многих случаях это не сработает или будет плохо работать, потому что попадания занимают слишком много памяти.

В идеале вы должны использовать прокрутку вместо .

Вот пример с Hibernate Search 5:

FullTextQuery ftQuery = /*...*/;
ScrollableResults scroll = ftQuery.scroll();
scroll.beforeFirst();
int i = 0;
while ( scroll.next() ) {
    ++i;
    MyEntity entity = scroll.get()[0];

    // ... do things with the entity ...

    // Flush/clear the session periodically to free memory
    if ( i % 100 == 0 ) {
        // Only necessary if you changed entities
        session.flush();
        // Only necessary if you changed indexed entities
        fullTextSession.flushToIndexes();

        session.clear();
    }
}

Для Hibernate Search 6 API будет другим. В настоящее время он реализуется ( HSEARCH-3323 ) и будет доступен в следующей бета-версии.

...