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

时间:2014-04-10 02:18:24

标签: sql sql-server full-text-search contains

我正在使用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有几百万条记录,并且它在艺术专栏上有全文索引,我知道我可以使用contains来搜索一个简单的术语(单个词/短语),如下所示:

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

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

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

但是如何在keyword_table中搜索ALL关键字?

提前致谢!

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

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)

注意我没有语法测试过这个:))

答案 1 :(得分:0)

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

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,但是,这个脚本可以很好地使用数百万个索引记录!