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, '%')
我有一个 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, '%')