mysql模糊查询富⽂本的⽂本内容
最近做项⽬遇到了⼀个需求,那就是对富⽂本消息列表增加⼀个搜索功能,输⼊⼀个搜索条件可以同时对标题和富⽂本的内容进⾏搜索。
刚开始觉得很简单,直接写个sql语句判断⼀下就OK了,于是最开始我是这样写的:
select n.obj_id,n.title,n.t,date_ate_time,'%Y-%m-%d %H:%i:%s') create_time from t_dwshhcj_notifyinfo n,t_dwshhcj_company_info c where instr(n.visible_scope,c.childdwlx)>0and c.obj_id ='56f891e5-b525-4b92-a4b
当时觉得这样写肯定没问题,但是⼀经测试,问题来了;因为content字段保存的是整个富⽂本信息,除了⽂本内容,还有html元素,⾏内样式,如果有图⽚的话还包含图⽚的id
等信息;这样的话,在搜索时就会搜索出⼀些标题和内容都不相关的列表。
针对这⼀问题我开始尝试解决的思路;
⾸先想到的就是使⽤mysql的正则替换,经过多⽅⾯的查阅资料才发现,mysql ⽀持的正则⾮常简单,⽽且低版本的mysql不具备正则替换的功能,mysql的正则只能类似于like
语句,⽤来对特定字符的匹配,并不能做到替换的功能。
-- 查name字段中以'st'为开头的所有数据:
SELECT name FROM person_tbl WHERE name REGEXP '^st';
-- 查name字段中以'ok'为结尾的所有数据:
SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
-- 查name字段中包含'mar'字符串的所有数据:
SELECT name FROM person_tbl WHERE name REGEXP 'mar';
-- 查name字段中以元⾳字符开头或以'ok'字符串结尾的所有数据:
SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';
如果将正则匹配作为结果,则是这样的:
很明显,要想通过mysql的正则来实现对纯⽂本的模糊查询是不⾏的。当时的我⼀脸蒙圈,⼼想这可咋整。
然后,就在那⼀瞬间,就那么⼀瞬间,我脑袋⾥灵光⼀闪,既然mysql正则不⾏,但是java的正则是可以的啊,于是我突然看到了光明,接着编准备动⼿⼲。
⾸先,在富⽂本的消息表中再新增⼀个字段,名字叫text_content,专门⽤来保存纯⽂本信息;
其次,在保存content的时候将content中的纯⽂本提取出来并保存到text_content;
最后,sql语句中的content换成text_content,也就是使⽤text_content来代替content来进⾏模糊查询。
select n.obj_id,n.title,n.t,date_ate_time,'%Y-%m-%d %H:%i:%s') create_time from t_dwshhcj_notifyinfo n,t_dwshhcj_company_info c where instr(n.visible_scope,c.childdwlx)>0and c.obj_id ='56f891e5-b525-4b92-a4bsql语句替换表中内容
提取纯⽂本使⽤以下⽅法去掉所有html元素;
String textContent = placeAll("<.*?>","")
搞定收⼯
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论