使用 Hibernate Search 查询并获取所有项目而不需要分页

Query with Hibernate Search and get all items without paging

我在 Spring 引导项目中使用 Hibernate Search。 在大多数情况下,它是满足我需求的完美解决方案,但在我必须通过全文搜索查询选择所有项目的情况下除外。

在使用 Hibernate Search 时是否有机会避免 Hibernate Search / Lucene 分页?类似 Pageable.unpaged() 的东西? 我不想将页面大小设置为 Integer.MAX_VALUE,因为它有点乱七八糟。 但是如果没有更好的解决办法,我就只好这么用了。

您通常不应该在单个请求中获取所有匹配项,因为可能有数百万个匹配项并且全部加载它们可能会导致内存问题。

如果您无论如何都想这样做,只需不对查询设置限制即可获取所有结果:

休眠搜索 5:

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

休眠搜索 6:

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

但是在很多情况下它不会工作或者会因为命中占用太多内存而表现不佳。

理想情况下,you should use scrolling instead

这是 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),将在下一个测试版中提供。