如何在 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 从另一个表中搜索关键字的主要内容,如果未能解决你的问题,请参考以下文章