【问题标题】:How to use contains in SQL to search for keywords from another table如何在 SQL 中使用 contains 从另一个表中搜索关键字
【发布时间】: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 的全文搜索,但我想问如何使用“包含谓词”从另一个表中搜索关键字?
  • 感谢您的澄清。

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


【解决方案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,但是,这个脚本运行良好且快速,可处理数百万条索引记录!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-10
    • 2019-06-28
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多