1 背景
企业搜索,文档搜索权限是不可或缺,原因有二, 首先,企业文档,包括公文,流程,技术文档等,带有敏感信息,需要权限控制,搜索返回带片段,可能带出敏感信息;其次,若没有权限,用户搜索出来的文档可能不能阅读原文,体验非常差
本文介绍文档搜索权限的设计和实现解释,M3还包括扩展字段和suggester将在后续增加
2 参考资料
《搜索引擎onesearch 1.0-设计与实现.docx》
《搜索引擎onesearch 2.0-设计与实现.docx》
3 术语
Ø 文档 Document
elasticsearch 一行数据称为文档,需要注意与文件/文档区分,有冲突的地方用“ES文档”区分
Ø 索引schema
相当于关系数据库的schema,xml格式,定义索引的字段,类型,还有搜索策略,分词等搜索相关属性
Ø 搜索/过滤
elasticsearch查询分两部分,搜索和过滤,搜索计算文档与搜索词相似(匹配)度,得出分数排序,分数越高相似度越高,排序也靠前;过滤相当于sql的where,结果是true或者false
Ø 分词
索引可以设定是否分词,分词,分词器分割文本或字符串成term,适用模糊搜索;反之,使用term查询
Ø 查询对象装配映射
elasticsearch es dsl 查询功能非常丰富,可调参数多, 提供精准细致的搜索调整,但也很难用,更难复用,onesearch设计装配映射组件支持通用表达式转换esdsl,用户只需编写通用表达式,如,((f1=‘a’or f2=’b’) and f3=‘c’)) 即可实现搜索过滤,类似elasticsearch自身也提供了sql查询功能,大大降低开发难度,同时具备高复用性
4 2.0规划特性
4.1 大规模/分布式文件索引
Ø 文档抓取
1) 文档内容抓取组件,metadata+content
2) 抓取组件隔离机制
Ø 索引引擎,基于分布式setl(批量/增量),reader/writer
4.2 精确搜索/多元搜索
Ø 装配/映射 增加支持query,目前已支持映射为filter
1) full Text查询映射策略
match
match_phrase
query_string
。。。
2) 高亮 (已有,未测试)
3) 返回字段,目前全返回
4) 批量操作,引擎层已实现
5) nested查询, nested索引已支持
Ø springboot starter
4.3 智能搜索
Ø 搜索权限,搜出就能看
Ø 扩展字段,用户自定义扩展索引字段
Ø suggester, 建议补全/建议纠错
5 onesearch总体架构
Ø schema模块,定义索引字段,索引策略,搜索策略等,管理索引及其搜索特性
Ø 聚合搜索(agg)模块,基于schema模块,支持xml定义agg,零编码增加agg主题
Ø 查询模块,负责构建通用表达式(如,((f1=‘a’or f2=’b’) and f3=‘c’)),作为搜索输入条件
Ø 映射引擎,映射通用表达式为最优的es dsl,支持=,!=,like,in,range,prefix,not/and/or,大小括号,点(.)等操作符映射,解决es dsl难使用,难复用的痛点
Ø 抽象搜索引擎接口,无缝接入不同的搜索引擎,如,elasticsearch,opensearch,solrcloud等,更可同时使用多种引擎
Ø 索引同步组件,全量同步/增量同步
Ø 文档抓取组件
Ø 文档权限,能搜就能看
Ø 扩展属性,用户自定义索引扩展字段
Ø suggester api,建议补全/建议纠错
6 文档权限
6.1 组件架构
permission-client 定义接入系统实现的接口PermissionClient,获取接入系统的文档权限,用户权限
permission-core-client PermissionClient rpc实现,feign/dubbo/…
permission-core 权限增强搜索核心包,包括权限增强搜索服务,PermissionClient工厂
permission-sync 权限同步,datax组件,elasticsearch部分更新机制
autoconfig 适配spring boot的配置,接入到onesearch spring boot starter
6.2 抽象文档权限模型
接入系统文档权限设计可以千差万别,但本质离不开两个关联,文档权限的关联,用户权限的关联,两者有共同的关联对象,用户有对应文档权限
6.3 文档权限client
文档权限client是接入系统实现,返回文档权限,用户权限,通过rpc调用
RPC支持扩展机制实现,feign,dubbo,grpc
6.4 索引permission字段
permission字段是type_id连接起来的字符串类型的数组;搜索权限鉴别使用term查询实现
上图,dept_1 管理部门id=1的可以访问该文档,如此类推
6.5 文档权限同步
文档权限同步使用elasticsearch部分更新,即只更新permission字段
统一使用增量,监控文档-权限变更,更新permission字段
CDC/轮询(marker), 其中marker捕捉不到删除,需要全量更新,根据时效要求,采取滚动的全量更新
转换的设计参考 《SETL基于规则的转换组件设计说明书.docx》
UpdateSyncStreamRecord,字段更新record,增加更新字段名称,该record不支持内容(content)更新,content更新走addDocument;更新record派生字Sync record,带有marker,记录处理位点
6.6 搜索服务增强
权限增强搜索服务
PermissionedSearchService 服务接收参数PermissionSearchRequest,继承SearchRequest,增加用户Id属性,用户上下文context,该两属性是permission client的参数
PermissionClient rpc接口,接入系统实现,获取文档owner,拼接到SearchRequest的filter表达式
权限增强搜索服务包装(wrapper)搜索服务
9 自动配置(文档搜索权限)
spring boot自动配置
权限增强搜索服务也是SearchService接口实现,增加@Primary,当设置
onesearch.permissioned.enable=true时实例,并优先
同时,增加rpc设置,上图是feign rpc