【问题标题】:How to combine Hibernate Search (Lucene) with paging and ACLs如何将 Hibernate Search (Lucene) 与分页和 ACL 结合使用
【发布时间】:2011-11-17 10:27:11
【问题描述】:

我正在使用带有 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 过滤它们,然后手动进行分页。但我不喜欢这种解决方案,因为它会加载所有文档,而不仅仅是页面的一个。

有人有更好的主意吗?

【问题讨论】:

    标签: java hibernate lucene acl hibernate-search


    【解决方案1】:

    如果您的 ACL 不是太复杂,即您的级别数量有限,那么我建议使用 Filter 和 Bitset 来实现它。

    您还可以在此处找到使用过滤器实现 ACL 的其他示例 http://java.dzone.com/articles/how-implement-row-level-access

    在这里,您将找到一个已投入生产至少 5 年的缓存 bitset 过滤器实现(这是我用于可搜索并行文本语料库的开源 web 应用)

    寻找 addSourceFilter 方法 http://code.google.com/p/hunglish-webapp/source/browse/trunk/src/main/java/hu/mokk/hunglish/lucene/LuceneQueryBuilder.java

    【讨论】:

      【解决方案2】:

      我也遇到过同样的问题,我认为没有简单的答案。

      我认为只有两种解决方案。您建议的那个有您描述的性能问题,因为您必须加载文档并为每个结果解析 ACL,然后进行自己的分页。另一种方法是将这项工作推到索引方面并在 Lucene 中索引您的 ACL。这为您提供了搜索性能,通过添加基于当前用户/组/权限/角色的过滤条件来隐藏用户看不到的结果,但代价是使用 ACL 信息维护索引。如果您的 ACL 很简单,那么这可能是一个选项。如果您的 ACL 是分层的,那么它仍然是一个选项,但更复杂。使用 ACL 使您的索引保持最新也很棘手。

      您开始研究此类功能的事实可能表明您开始扩展您的数据库/Hibernate/Lucene 解决方案。也许像 Jackrabbit 这样的内容存储库可能更合适?我想这可能是一步太远了,但可能值得一看,看看它是如何做到的。或者看看 SOLR,尤其是这个issue,它描述了它是一个多么棘手的问题。

      【讨论】:

        【解决方案3】:

        Here 是我使用纯 Lucene 查询(在 Hibernate Search 之上)的复杂用户/组/角色分层 ACL 系统的 ACL 实现。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-14
          • 1970-01-01
          • 2015-06-05
          • 1970-01-01
          • 2013-11-06
          • 2013-01-11
          • 2011-12-22
          相关资源
          最近更新 更多