Lucene权限实现

1、权限过滤

Lucene的基于关键字的评分机制,适用于基于相关度的过滤和排序。它是基于矢量模型,其中给文档分配一个相应的分数,分数越高相关的文档也越多。然而,应用系统有时因为用户级权限仅需返回相关文档的子集。

过滤的权限问题实际上是查询时将一个布尔过滤器作用于文档的普遍问题的子问题。我们将探讨这种过滤的实现方法。

2、查询改写

上述权限过滤明显的实现方法,就是改写搜索查询为要求某字段包含特定的值。

例如,如果有一个“类别(category)”字段(Field),并假设仅显示历史(history)和科学(science)类的文档,然后对给定的用户查询:

<query>

查询可被改写为:

<query>+category:history+category:science

3、查询过滤器

此种假设对于过滤的字段(Field)可能是不适宜或不可行的(也许由于字段(Field)是易变的和频繁的变化将导致索引的大量修改)。另一方法是通过 实现Filter接口创建一个过滤器,只需实现一个方法,即bits()方法,该方法返回BitSet,包含命中的所有允许文档ID。

在bits()方法中,可使用TermEnum通过Term筛选(速度慢!),或使用FieldCache检索字段的所有值(速度快,但为内存密集型!)。

4、HitCollector + FieldCache

另一个筛选文档(Documents)的方法是使用HitCollector而非Hits对象。在collect()方法以文档(Document)ID和评分(score)作为参数,可以此来判断文档允许访问与否。

使用HitCollector有一个小缺点,Hits类中遍历搜索结果的有用方法都没有公布,但解决方法容易。

5、范例

比方说,你有一个多用户博客程序,并希望让用户搜索全部(默认)博客文章,或允许用户只搜索他发表的博客。博客应用的Lucene模型将每一博客映射为一Document。

使用查询改写方法,可以轻松地为该查询附加搜索(条件)子句:

<query>+author:<authorid>

这将只返回作者的文档。问题解决了。

现在,扩展该示例。假设在应用中存在3种访问角色:管理员(admin),编辑(editor),作家(author)。这些访问角色的权力是递减的,所 以一个编辑(editor)对作者的博客有写(write)权限,但对管理员(admin)的博客无此权限。如何才能让用户只搜索他具有写访问权限的博客 呢?

查询改写方法可用来为每一文档(Document)添加一个“角色(role)”字段(Field),并现场填入作者角色(role)。假设用户的角色为编辑(editor),那么改写后查询为:

<query>+(role:editor role:writer)

这种方法是有效的,但不是最理想的,因为每次作者的角色会改变,就需要更新他所写所有博客文档(Documents)。

另一种使用查询改写的方法是获得角色为编辑(editor)和作者(writer)的所有用户列表,然后追加到查询后,如下所示:

<query>+(author:1author:2 author:......)

这方法更好,但庞大的或-查询子句对于布尔过滤可能会妨碍搜索性能。

实现该功能的第三种方法是获取期望的用户列表,如同上前一方法,但不是改写查询,而是使用HitCollector + FieldCache的方法,因此只接受所期望的博客。这种方法具有第二种方法的优势但无性能问题。

时间: 2024-10-23 06:18:11

Lucene权限实现的相关文章

SpringMVC + Mybatis + SpringSecurity(权限控制到方法按钮) + Rest(服务) + Webservice(服务) + Quartz(定时调度)+ Lucene(搜索引擎) + HTML5 bootstrap + Maven项目构建绝对开源平台

框架整合: Springmvc + Mybatis + Shiro(权限) + REST(服务) + WebService(服务) + JMS(消息) + Lucene(搜搜引擎) + Quartz(定时调度) + Bootstrap Html5(支持PC.IOS.Android) 需要源码请加Q:3121026417   此处[源码获取地址] 框架简介: 项目Maven构建,真实大型互联网架构,做到高并发,大数据处理,整个项目使用定制化服务思想,提供模块化.服务化.原子化的方案,将功能模块进行

jQuery、HTML5、Spring Security安全权限、Lucene全文检索

获取[下载地址]   QQ: 313596790   [免费支持更新]支持三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]A 代码生成器(开发利器);      增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid

Spring MVC、Mybatis、Hibernate、Bootstrap、jQuery、HTML5、Spring Security安全权限、Lucene全文检索、Ehcache分布式缓存 、高性能、高并发【Java企业通用开发平台框架】

获取[下载地址]   QQ: 313596790   [免费支持更新] A 代码生成器(开发利器);    B 阿里巴巴数据库连接池druid;   数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势 C 安全权限框架shiro ;  D ehcache 自定义二级缓存; E 微信接口开发(后续会加入Activiti5 工作流 )免费升级 -------------------------------------------------------

Spring MVC、Mybatis、Hibernate、Bootstrap、HTML5、jQuery、Spring Security安全权限、Lucene全文检索、Ehcache分布式缓存 、高性能、高并发【Java企业通用开发平台框架】

功能特点: 1.适配所有设备(PC.平板.手机等),兼容所有浏览器(Chrome.Firefox.Opera.Safari.IE6~IE11等),适用所有项目(MIS管理信息系统.OA办公系统.ERP企业资源规划系统.CRM客户关系管理系统.网站.管理后台等). 2.快速开发,敏捷的数据持久层解决方案. 2.1.事务自动处理. 2.2.O/R Mapping基于注解,零配置XML,便于维护,学习成本低. 2.3.接口和实现分离,不需写数据持久层代码,只需写接口,自动生成添加.修改.删除.排序.分

Solr实现 并集式、多值、复杂 过滤查询的权限【转】

公司开发使用的搜索引擎核心是Solr,但是应为业务原因,需要相对复杂权限机制. 1)通过Solr的filterQuery可以实现field过滤,实现过滤项的效果.索引A{filter1:a,field2:a,field3:a,field4:1}B{filter1:b,field2:b,field3:b,field4:2}C{filter1:c,field2:c,field3:c,field4:3}过滤条件fq=field:b结果B{filter1:b,field2:b,field3:b,fiel

springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】

项目结构: 1.maven项目的pom中引入shiro所需的jar包依赖关系 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <dependency>     <groupid>javax.servlet</groupid>     javax.servlet-api</artifactid>     <version>3.0.1</version>

安全权限、高性能、高并发、分布式java shiro、maven、Bootstrap、SpringMVC、Mybatis

获取[下载地址]   QQ: 313596790   [免费支持更新]支持三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]A 代码生成器(开发利器);      增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid

Bootstrap、jQuery、HTML5、Spring Security安全权限

获取[下载地址]   QQ: 313596790   [免费支持更新]A 代码生成器(开发利器);全部是源码     增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势C 安全权限框架shiro ;  Shiro 是一个用

三、系统权限之角色抉择

为什么我不将设计好的数据库摆上来就好了呢?而是在此“卖弄”,不就是一个简单的权限管理吗? 我觉得做一个完美的权限管理系统,真不是个简单的事情,园子里的“超级老吉日嘎拉”做权限不也搞了好久么?我这人不怎么爱看文章,所以我也不参考他的成果,我只做我想做的,享受过程.学会总结更重要. 大多权限管理系统,都是用户-角色-权限表这样的设计,组织(部门)跟角色是剥离的.过去我做权限系统设计,也都是秉承"用户-角色-权限"这样的设计理念的.5年的时间,经历了4家公司,在每一家公司里,都深知得这样的设