「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!」
导读:我们在实现检测一个字符串是否包含另一个字符串时,简单的用一个字符串匹配算法就可以实现,如果要实现检测一个字符串是否包含 N 个字符串时,这个 N 有可能上千万,再利用简单的字符串匹配算法就没法满足我们的需求了,上千万的词需要可以灵活的维护,业务方匹配时能够拿到自己的词进行匹配,千万词的匹配需要保证匹配速度,要在秒级之内出结果。所以,我们需要一套解决此类问题的方案——词表服务 。
全文5370字,预计阅读时间 12分钟。
一、背景
内容审核平台需要检测作者发的文章中是否含有特殊的敏感词。对于不同的业务线对这些词的要求也不同,有的严格有的宽松;有的需要单词,有的需要多词;有的需要检测出隐含词、变体词;有的在标题生效,有的在正文生效;有的检测出送人审,有的检测出直接拒绝;有的需要几千词,有的需要上万、百万、甚至千万词。对于这些词各业务线可以自己维护,方便增加、删除、修改,各业务可以根据自己的需求配置词的生效规则;在检测的时候业务方可以拿到自己维护的词对文章进行检测,而且需要保证检测的时效,能够实时拿到检测结果。
二、架构
上图是词表服务的整体架构:
(1)词表管理:各业务线在词表管理平台维护自己的词表,每个业务线可以添加多个词表组,每个词表组中可以维护敏感词以及可以动态添加敏感词的属性;词表管理平台用ES实现了对词表及上千万词高效的分词检索能力;词表管理会定时生成各业务线的词表BOS文件,上传到BOS服务。
(2)服务层:业务方调用词表服务统一对外的匹配接口,服务层将匹配任务送到策略算子层,完成词表的匹配功能。词表对外的统一服务相当于一个简单的网关,提供了鉴权功能,验证请求是否合法;提供了流量限制的功能,可以为每个请求方设置流量限制值;提供了结果处理的功能,策略算子返回的敏感词属性只是一部分,根据业务方的需求,可以完善策略算子返回的敏感词属性;提供了流量转发的功能,可以根据配置将各业务线的请求打到不同的集群,实现各业务策略算子分集群部署。
(3)策略算子层:策略算子实现对文本中敏感词的匹配,匹配的模式有包含匹配、强过滤匹配、多模匹配,命中的敏感词会返回给词表服务层。各业务线的词表会被策略的每个算子用全量刷新的方式或者实时同步增量数据的方式加载到内存,支持算子的匹配功能。全量刷新的方式:词表管理平台会定时将词表分业务线生成BOS文件,上传到 BOS 服务,策略算子定时从BOS文件中同步敏感词到内存;实时同步的方式:策略算子会实时扫描刺词表数据库,将增量的词表加载到内存。
(4&#x