我正在使用带有 ACL 的 Spring Security 来保护我应用程序中的文档。另一方面,我使用 Hibernate Search(在 lucene 之上)来搜索文档。这个搜索也支持分页。 (文档只是存储在数据库中的文档的元数据。)
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Document.class).get();
Query query = queryBuilder.keyword().onFields(fieldNames.toArray(new String[0])).matching(searchQuery)
.createQuery();
FullTextQuery fullTextQuery = fullTextEntityManager.createFullTextQuery(query, Document.class);
fullTextQuery.setFirstResult(pageable.getFirstItem());
fullTextQuery.setMaxResults(pageable.getPageSize());
现在我必须将分页与 ACL 结合起来。我目前唯一的想法是从 FullTextQuery 中删除分页,读取所有搜索结果文档,通过 ACL 过滤它们,然后手动进行分页。但我不喜欢该解决方案,因为它会加载所有文档,而不仅仅是页面的一个文档。
有没有人有更好的主意?
最佳答案
如果您的 ACL 不是太复杂,也就是说您的级别数量有限,那么我建议使用 Filter和 Bitset 来实现它。
在这里,您将找到使用过滤器实现 ACL 的其他示例 http://java.dzone.com/articles/how-implement-row-level-access
在这里你会发现一个缓存的 bitset 过滤器实现,它已经投入生产至少 5 年(这是我的开源网络应用程序,用于可搜索的并行文本语料库)
寻找addSourceFilter方法 http://code.google.com/p/hunglish-webapp/source/browse/trunk/src/main/java/hu/mokk/hunglish/lucene/LuceneQueryBuilder.java
关于java - 如何将 Hibernate Search (Lucene) 与分页和 ACL 结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8165584/