You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询需求:从长字符串中匹配表内关键词短语

解决方法:直接匹配关键词是否存在于长文本中

不需要将长字符串解析为数组,直接通过字符串包含判断就能实现需求,以下是不同SQL方言的具体实现方案:

MySQL 实现

假设你的关键词表名为keywords,存储短语的字段为phrase,输入的长文本用参数@input_text传递:

基础匹配(不考虑单词边界)

SELECT phrase
FROM keywords
WHERE INSTR(@input_text, phrase) > 0;

或者用LIKE语法:

SELECT phrase
FROM keywords
WHERE @input_text LIKE CONCAT('%', phrase, '%');

严格匹配完整短语(避免部分匹配,比如防止"one"匹配"phone")

可以通过给文本前后加空格,确保短语作为独立单元存在:

SELECT phrase
FROM keywords
WHERE CONCAT(' ', @input_text, ' ') LIKE CONCAT('% ', phrase, ' %');

性能优化(针对3000条数据)

如果需要更快的查询速度,可以给phrase字段创建全文索引:

-- 先创建全文索引
ALTER TABLE keywords ADD FULLTEXT INDEX ft_phrase(phrase);

-- 使用全文索引查询
SELECT phrase
FROM keywords
WHERE MATCH(phrase) AGAINST(@input_text IN BOOLEAN MODE);

注意:如果要匹配完整短语,需要在查询时给目标短语加双引号,比如AGAINST('"big one"' IN BOOLEAN MODE)。

PostgreSQL 实现

基础匹配

SELECT phrase
FROM keywords
WHERE strpos(@input_text, phrase) > 0;

严格匹配完整短语(正则单词边界)

SELECT phrase
FROM keywords
WHERE @input_text ~* ('\m' || regexp_replace(phrase, '([\W])', '\\1', 'g') || '\M');

~*表示不区分大小写匹配,\m匹配单词开头,\M匹配单词结尾,regexp_replace用来转义短语中的特殊正则字符。

SQL Server 实现

基础匹配

SELECT phrase
FROM keywords
WHERE CHARINDEX(phrase, @input_text) > 0;

严格匹配完整短语

SELECT phrase
FROM keywords
WHERE PATINDEX('%[^a-zA-Z0-9]' + phrase + '[^a-zA-Z0-9]%', ' ' + @input_text + ' ') > 0;

通过给文本前后加空格,确保短语在单词边界处匹配。

关键说明

不需要拆分长文本为数组的原因:拆分长文本会生成大量子串,遍历这些子串去匹配关键词表,效率远低于直接遍历3000条关键词,判断其是否存在于长文本中。

内容的提问来源于stack exchange,提问作者James Johnson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:31:04