论坛首页 Java企业应用论坛

lucene搜索和权限怎么结合呢?

浏览 7196 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-03-01  
现有一已有的CMS系统,希望在原来的关键词搜索基础上加上全文检索。
该CMS系统原有的权限设计是这样的:有一个cms_info表,我们假设其中最有用的是id,keywords,content 3个字段,字段见名知意,另外还有一个cms_acl表,其中最有用的字段是refid,visit 2个字段,refid是cms_info的id字段外键,visit是访问类型,具体解释一下visit:该CMS系统中的授权对象比较复杂,有用户,岗位,部门,岗位组,等等,分别建在不同的表里面,如果visit里面有U131,意思就是id为131这个用户可以访问文档,同样G表示岗位组,P表示岗位,D表示部门,同样visit里面可能存在G22等值。
如果我们要实现关键字查询,可以如下:
select a.id from cms_info a,cms_acl b where a.id = b.refid and a.keywords like ? and b.visit in (...)
其中b.visit in (...)的...是通过一个登录用户的查询到他所属的岗位,部门,岗位组,得到的一个串。这样也可以实现sql的分页。
现在客户希望对content(如果同时也对keywords)进行全文检索,我用的compass+lucene,现在只能做到把所有的都查出来,只是用户在点链接看具体内容时候提示他没有相应的权限。现在用户希望在全文检索时候就像关键词检索一样,没有权限的就不要列出来。我想总不能全部列出来后再来个filter吧,现在总文章也有5,6万条了,不知大家有何好的解决办法?
   发表时间:2007-03-01  
我采用这种方法,大家探讨一下。
在web页面分页有startIndex,pageSize,不妨称为web_startIndex和web_pageSize。根据条件从lucene检索出符合的记录总数,查找的纪录总数(当然这个纪录总数对特定的用户来说不一定有权限查看全部,不过个人认为可以解释为系统中符合条件的有那么多)。
然后分页检索lucene,有lucene_startIndex,lucene_pageSize两个参数,建议lucene_pageSize取为web_pageSize的n倍,这样的lucene_pageSize的lucene纪录经过权限过滤后一般情况下应该大于web_pageSize。从lucene检索回的分页记录经过权限过滤后,如果纪录数小于web_pageSize,则再向lucene取回下一页数据;若大于web_pageSize,则记录到实际使用的条目,把这个作为下一页的lucene_startIndex。
以上不是描述得不是很好,分页的逻辑稍微复杂一些。


另外有个问题请熟悉compass的人帮忙确认一下,compass在索引后是否在缓存中存放被索引的对象,该对象什么时候被从缓存清除。如果我使用compass做索引,而用lucene的API做检索,是否需要在compass做索引时清除被索引的对象?
0 请登录后投票
   发表时间:2007-06-22  
解决了吗?也遇到了这个问题。
0 请登录后投票
   发表时间:2007-06-22  
把每篇文章的权限写入索引,查询时根据当前用户权限构建query不就可以了吗
0 请登录后投票
   发表时间:2007-06-25  
有些系统的权限是比较复杂的,跟业务很相关,所以写在索引并不是好方法,并且权限结构复杂一些的话,更新权限数据时同步索引中的权限数据可能不是一件愉快的事情。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics