mysql全字符串匹配的反方向匹配

ruarlubt  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(430)

我有一个表,上面定义了一千多个“关键字”,包括带空格的关键字,比如:

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

等。
我需要从这个表中匹配一个大的复杂字符串(比如一个段落),以确定文本中是否存在任何关键字。例如,我需要以下的“处理”:

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

返回

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

据我所知,我不能使用match-against,因为即使使用引号,它也不能精确匹配单词和空格(例如,“r&d expert”-会提取包含“expert”的匹配,这是我不想要的),而且我经常需要扫描/匹配动态书写的文本(例如简历中的一段)。
我可以编写循环遍历每个关键字(超过1000个)和扫描文本(有时可能超过500个字符)的代码,但与我可能忽略的内部函数相比,这将是非常缓慢和低效的。
除了循环浏览数据库中的每个关键字并查看它是否存在(完全是逐字逐句地)在一个文本块中之外,还有什么方法来完成我正在尝试做的事情吗?

2vuwiymt

2vuwiymt1#

regexp方法怎么样?假设一个表叫做 keywords 带列 kw ,以及变量中的长字符串 @longstring :

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

这假设您要匹配整个单词: \b 表示单词边界。只有MySQL8.0才支持这个正则表达式。在早期版本中,您可以执行以下操作:

select k.*
from keywords k
where @longstring regexp concat('[[:<:]]', k.kw, '[[:>:]]')

当然,如果你对部分匹配满意, like 足够好了:

select k.*
from keywords k
where @longstring like concat('%', k.kw, '%')

相关问题