MySQL MATCH AGAINST 相反方向的完整字符串匹配

MySQL Full String Match in Opposite Direction of MATCH AGAINST

我有一个 table 定义了超过一千个“关键字”,包括带空格的关键字,例如:

1 | C# Developer
2 | C++
3 | R&D Expert
4 | President/Founder
5 | Kittens

等等

我需要将 FROM this table 与一个大的复杂字符串(比如一个段落)进行匹配,以确定文本中是否存在任何关键字。例如,我需要下面的“处理”:

I am a C++ developer and a R&D Expert who loves Kittens!

到return

2 | C++
3 | R&D Expert
5 | Kittens

据我所知,我不能使用 MATCH AGAINST,因为即使使用引号,它也不会对带空格的单词进行精确匹配(例如“R&D Expert” - 会提取包含“Expert”的匹配项",我不想要)而且我经常需要 scan/match 反对动态书写的文本(例如简历中的一段)。

我可以编写循环遍历每个关键字(超过 1,000 个)并扫描文本(有时可能超过 500 个字符)的代码,但与我可能忽略的内部函数相比,这会非常慢且效率低下.

除了从数据库中循环遍历每个关键字并查看它是否存在于文本块中(逐字逐句)之外,还有什么方法可以完成我正在尝试做的事情吗?

正则表达式方法怎么样?假设 table 名为 keywords,列为 kw,并且您的长字符串在变量 @longstring:

select k.*
from keywords k
where @longstring regexp concat('\b', k.kw, '\b')

假设您想要匹配整个单词\b代表单词边界。此正则表达式符号仅在 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, '%')