之前博客中编写了一篇后端过滤的文章https://blog.csdn.net/huangbaokang/article/details/82869661
考虑了下性能,完全可以让数据库接替这项工作。
编写一共自定义函数isbadcomment,接收一个输入字符串,输出结果为一个判别标识符。1:含有敏感过滤词,0:正常评论词,该函数中写死了比例0.5,也可以稍微封装下变成输入参数,说明下。
create or replace
FUNCTION ISBADCOMMENT
(
str in varchar2 --传递过来的评论短语
) return number as
---==================党员生活评论列表过滤词过滤 writed by hbk 2018-11-07===============================
-- 定义变量
cursor words_lists is select * from t_bad_words;
counts number;--统计出现次数
begin
--变量初始化
for word in words_lists loop
begin
-- 过滤的逻辑 过滤词长度*出现次数/评论的长度>0.5
-- 计算过滤词出现的次数
select nvl(length(regexp_replace(replace(str, word.name, '@'), '[^@]+', '')),0) into counts from dual;
sys.dbms_output.put_line('过滤词='||word.name||',自身长度='||length(word.name)||' 出现次数='||counts||'评论短语长度='||length(str));
if ((length(word.name))*counts/(length(str)))>0.5 then
begin
sys.dbms_output.put_line('不符合要求的评论');
return 1;
end;
end if;
end;
end loop;
sys.dbms_output.put_line('符合要求的评论');
return 0;--默认返回0,如果t_bad_words表没有数据的情况下
END ISBADCOMMENT;
sql上就可以拼接需要的逻辑。
and (case com.member_id when '"+jo.getString("member_id")+"' then 0 else isbadcomment(com.comment_content) end)=0