我有一张桌子,上面有一千多个"关键字";定义的,包括带空格的关键字等,如:
1 | C# Developer
2 | C++
3 | R&D Expert
4 | President/Founder
5 | Kittens
等等。
我需要将FROM这个表与一个大型复杂字符串(比如一段(进行匹配,以确定文本中是否存在任何关键字。例如,我需要";处理";其中:
I am a C++ developer and a R&D Expert who loves Kittens!
返回
2 | C++
3 | R&D Expert
5 | Kittens
据我所知,我不能使用MATCH反对,因为即使有引号,它也不会对带空格的单词进行精确匹配(例如,"研发专家"-会提取包括"专家"在内的匹配项,这是我不想要的(,而且我经常需要扫描/匹配动态书写的文本(如简历中的段落(。
我可以编写代码,遍历每个关键字(超过1000个(并扫描文本(有时可能超过500个字符(,但与我可能忽略的内部函数相比,这将是非常缓慢和低效的。
除了循环浏览数据库中的每个关键字,看看它是否存在(逐字逐句(在一个文本块中之外,还有什么方法可以完成我想要做的事情吗?
regexp方法怎么样?假设一个名为keywords
、列为kw
的表,以及变量@longstring
:中的长字符串
select k.*
from keywords k
where @longstring regexp concat('\b', k.kw, '\b')
这假设您想要匹配整个单词:b
代表单词边界。此regex表示法仅在MySQL 8.0中受支持。在早期版本中,您可以执行以下操作:
select k.*
from keywords k
where @longstring regexp concat('[[:<:]]', k.kw, '[[:>:]]')
当然,如果你对部分匹配感到满意,like
就足够了:
select k.*
from keywords k
where @longstring like concat('%', k.kw, '%')