java - 如何将 Hibernate Search (Lucene) 与分页和 ACL 结合起来

标签 java hibernate lucene acl hibernate-search

我正在使用带有 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/

相关文章:

java - 如何创建禁用其他按钮的功能

java - 无法在 glassfish 上运行或部署我的项目

java - Hibernate 标准如何不加载子进程

solr - org.apache.solr.common.SolrException 流主体被禁用

elasticsearch - 如何在 Elasticsearch 中建立索引和 bool 查询,以在某些字段上执行前缀匹配并在其他字段上执行精确短语匹配?

java - 无法将文件从 Android 上传到 PHP 服务器

java - JBoss EAP 7 java.lang.IllegalArgumentException 通过 Gradle 脚本配置 JBoss EAP 7 数据源的问题

search - 理解Apache Lucene的评分算法

java - String 数组的 @StringDef 自定义注解

java - Spring boot + JPA + Hibernate + Oracle 在应用程序启动期间不会自动创建表,并且日志中没有报告错误