如何在 SQL 中使用 contains 从另一个表中搜索关键字

Posted

技术标签:

【中文标题】如何在 SQL 中使用 contains 从另一个表中搜索关键字【英文标题】:How to use contains in SQL to search for keywords from another table 【发布时间】:2014-05-23 12:55:55 【问题描述】:

我使用的是 MS SQL Server 2012,我有两个表:

1) Keyword_table 包含关键字列表,例如:

keyword, nvarchar(50)
-------------------
web
book
AI
work
...

2) art_table 包含 ID 和文章列表,例如:

artID,  int         art,  nvarchar(MAX)
---------------------------------------
1                  The Web is a system of ...
2                  AI is the intelligence exhibited by machines or software ...
3                  The Web includes Web 1.0, Web 2.0 and Web 3.0
4                  The work done by ...
....

我想搜索keyword_table中的每个关键字,得到包含该关键字的文章的数量,例如根据上面的数据,结果应该是这样的:

keyword            No of articles
----------------------------------
web                2
book               0
AI                 1
work               1

art_table 有几百万条记录,并且在 art 列上有全文索引,我知道我可以使用contains 来搜索一个简单的术语(单个单词/短语),如下所示:

select *
from art_table
where contains (art, 'web')

并统计包含web的文章数量:

select count(*)
from art_table
where contains (art, 'web')

但是如何搜索关键字表中的所有关键字?

提前致谢!

【问题讨论】:

@AdamCaviness 我正在使用 SQL Server 的全文搜索,但我想问如何使用“包含谓词”从另一个表中搜索关键字? 感谢您的澄清。 【参考方案1】:

试试这样的:

select a.* from art_table a
inner join keyword_table b
on a.art like '%' + b.keyword + '%'

这应该会根据关键字为您提供匹配项,并返回其中包含关键字的所有记录。

[编辑]

也许试试这个?

select a.* from art_table a
inner join keyword_table b
on contains(a.art,  b.keyword)

注意我没有对此进行语法测试:)

【讨论】:

感谢您的回复。它有效,但是性能非常糟糕。 art_table 有几百万条记录,所以我在艺术列上创建了一个全文索引,这就是为什么我需要使用“包含”而不是“喜欢” “select a.* from art_table a inner join keyword_table b on contains(a.art, b.keyword)”是不正确的语法:) 值得一试 :) 只是一个问题,您尝试加入很多记录以进行关键字搜索。有没有打算减少搜索词的数量?如果您有数百万行,那么您也可以加入英语语言:) art_table 包含数百万篇英文文章,我正在尝试用几百个关键字进行一些分析:) 除了我最初建议的查询之外,我想不出任何方法来实现您所追求的结果,并在确保您的索引正常之外获得改进的性能。对不起:(【参考方案2】:

如果有人遇到同样的需求,这里有一个建议的答案:

DECLARE @kword nvarchar(200);
DECLARE keywordCursor CURSOR FOR(SELECT keyword FROM keyword_table);
OPEN keywordCursor;
FETCH NEXT FROM keywordCursor INTO @kword;
WHILE @@FETCH_STATUS=0
BEGIN
    INSERT INTO keyword_occ(keyword,occ)
    VALUES(@kword,(SELECT count(*) FROM art_table WHERE CONTAINS(art, @kword)));
    FETCH NEXT FROM keywordCursor INTO @kword;
END;
CLOSE keywordCursor;
DEALLOCATE keywordCursor;
GO

其中keyword_occ 是一个表格(keyword nvarchar(200), occ int),用于保存所需的结果。

我希望我能避免使用WHILE loop,但是,这个脚本运行良好且快速,可处理数百万条索引记录!

【讨论】:

以上是关于如何在 SQL 中使用 contains 从另一个表中搜索关键字的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL 查询从另一个表中更新作为下拉列表的字段

如何从另一个元素选择中选择属性

如何从另一个 .js 文件调用 .js? [复制]

如何在特定位置添加项目

插入触发器 SQL。插入新表后如何从另一个表中检索值

如何在 postgresql 中使用 postgres_fdw 从另一个数据库中获取记录