在SQL Server中使用CONTAINS进行搜索

时间:2014-04-30 11:31:14

标签: sql sql-server tsql

我创建了一个学生表,并有以下记录。

enter image description here

我想在同一张桌子上进行搜索。我尝试了以下查询。

SELECT * FROM Students WHERE Name LIKE '%AM%'

它返回前两行作为结果集,这是正确的。

我想使用关键字CONTAINS执行相同的查询,而不是LIKE。

我尝试了以下查询,但它没有返回任何结果集。

SELECT * FROM Students WHERE CONTAINS(Name,'"AM"')
SELECT * FROM Students WHERE CONTAINS(Name,'"AM*"')
SELECT * FROM Students WHERE CONTAINS(Name,'"*AM*"')

请帮我解决这个问题。

提前致谢。

2 个答案:

答案 0 :(得分:0)

为表格列定义全文索引并执行查询。

添加全文索引的示例: Cannot use a CONTAINS or FREETEXT predicate on table or indexed view because it is not full-text indexed

答案 1 :(得分:0)

  1. 启动MSSQLFDLauncher(SQL Server - >配置工具 - >配置管理器 - >全文过滤器守护程序启动器 - >启动)
  2. 运行此代码(或具有必要索引的此类代码)

    为学生创建独特的索引IX_ID(ID)

    创建FULLTEXT CATALOG Students_Catalog

  3. 你不能在单词的中间使用全文搜索,使用CTE也不正确(因为全文索引),所以我们会尝试使用一些技巧... < / p>

  4. 添加分割名称并使每个字母像单词

    的功能

    / *  作者:Paul Simpson(由Alex Peshik修改用于测试目的!)  创建日期:2012年7月19日(修订日期:2014年5月6日)  说明:在字母之间放置空格+下划线。示例:“GEORGE”变为“_G _E _O _R _G _E”* /

  5. 创建功能udf_PutSpacesBetweenChars

    (@String VARCHAR(100))
    
    RETURNS VARCHAR(100)
    AS
    BEGIN
       DECLARE @pos INT, @result VARCHAR(100); 
       SET @result = @String; 
       SET @pos = 2 -- location where we want first space 
       WHILE @pos < LEN(@result)+1 
       BEGIN 
           SET @result = STUFF(@result, @pos, 0, SPACE(1));
           SET @result = STUFF(@result, @pos+1, 0, '_') -- add underscore (to imitate word)
           SET @pos = @pos+3; -- (the original was +2)
       END 
       RETURN '_'+@result; -- add leading underscore (the original is w/o it)
    END
    
    1. 在其上添加新列和索引(我们不能使用持久计算列,因为它的非确定性列。)

      ALTER TABLE学生添加NameSpaced varchar(100)

      更新学生SET NameSpaced = dbo.udf_PutSpacesBetweenChars(Name)

      为学生创建FULLTEXT索引(NameSpaced)KEY INDEX IX_ID ON Students_Catalog;

    2. 使用特殊技术搜索近字母/'单词'。单词之间的距离为1,TRUE仅表示该顺序(“a,m”而不是“m,a”)。

      SELECT *来自学生WHERE CONTAINS(NameSpaced,'NEAR((_ a,_m),1,TRUE)')

    3. 很抱歉,解决方案非常庞大,我不知道如何简化它......