MySQL完全字符串匹配的相反方向的Match反对



我有一张桌子,上面有一千多个"关键字";定义的,包括带空格的关键字等,如:

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, '%')

最新更新