我正在研究索引引擎,特别是 Apache Lucene Solr。我们愿意将它用于我们的搜索,但我们的框架搜索解决的问题之一是行级访问。
Solr 不提供开箱即用的记录访问:
<...> Solr 不关心文档级别或通信级别的安全性。
在关于文档级安全性的部分:http ://wiki.apache.org/solr/SolrSecurity#Document_Level_Security
很少有建议 - 要么使用 Manifold CF(它是高度无证的,而且似乎处于非常预测试阶段)或编写你自己的请求处理程序/搜索组件(该部分被标记为存根) - 我猜后者会有对性能的影响更大。
所以我认为在这个领域做的并不多。
在最近发布的 Solr 4.0 版本中,他们引入了连接两个索引实体。加入似乎是一个不错的主意,因为我们的框架也做了一个加入来了解用户是否可以访问记录。这里的问题是,有时我们会进行内部连接,有时会进行外部连接(取决于范围内的乐观(所有不被禁止的东西都是允许的)或悲观的(所有东西都是被禁止的,只有明确允许的)安全设置)。
为了更好地理解我们的结构是什么样的:
文件
DocumentNr | Name
------------------
1 | Foo
2 | Bar
文档记录访问
DocumentNr | UserNr | AllowRead | AllowUpdate | AllowDelete
------------------------------------------------------------
1 | 1 | 1 | 1 | 0
因此,例如,为悲观安全设置中的文档生成的查询将是:
SELECT * FROM Documents AS d
INNER JOIN DocumentRecordAccess AS dra ON dra.DocumentNr=d.DocumentNr AND dra.AllowRead=1 AND dra.UserNr=1
这将只返回 foo,但不返回 bar。在乐观的情况下:
SELECT * FROM Documents AS d
LEFT JOIN DocumentRecordAccess AS dra ON dra.DocumentNr=d.DocumentNr AND dra.AllowRead=1 AND dra.UserNr=1
返回两者 - Foo 和 Bar。
回到我的问题 - 也许有人已经这样做并且可以分享他们的见解和经验?