代码之家  ›  专栏  ›  技术社区  ›  jessegavin

SQL问题:使用CONTAINS()不起作用,但是LIKE可以很好地工作

  •  13
  • jessegavin  · 技术社区  · 15 年前

    我在SQL Server数据库中有一个Products表,我必须对使用全文索引的遗留存储过程进行故障排除。出于我们在这里的目的,让我们假设Products表有两个字段ID和关键字。“关键字”字段将填充以下内容:

    罗兰SA-300这款罗兰SA-300是 在薄荷状态!

    当我运行以下语句时,我能够检索记录:

    SELECT * FROM Products WHERE Keywords LIKE '%SA-300%'
    

    但是,当我运行以下任何语句时,都不会得到任何结果:

    SELECT * FROM Products WHERE CONTAINS(Keywords, ' SA-300 ')
    SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA-300')
    SELECT * FROM Products WHERE CONTAINS(Keywords, '"SA-300"')
    SELECT * FROM Products WHERE CONTAINS(Keywords, '"*SA-300*"')
    

    但我知道CONTAINS()函数正在工作,因为我在运行以下任何一项时都会得到结果:

    SELECT * FROM Products WHERE CONTAINS(Keywords, ' Roland ')
    SELECT * FROM Products WHERE CONTAINS(Keywords, 'Roland')
    SELECT * FROM Products WHERE CONTAINS(Keywords, '"Roland"')
    SELECT * FROM Products WHERE CONTAINS(Keywords, '"*Roland*"')
    SELECT * FROM Products WHERE CONTAINS(Keywords, 'Roland')
    

    我需要弄清楚为什么CONTAINS()函数在'SA-300'术语上不起作用。我不熟悉全文索引,因此非常感谢您的帮助。

    5 回复  |  直到 15 年前
        1
  •  16
  •   Community basarat    7 年前

    两个想法:

    (1) 连字符可能被视为断字 这些是什么回报?

    SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA')
    SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA 300')
    SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA300')
    

    看到这个了吗 other question .

    (2) 您是否尝试过重建全文索引?它可能已经过时了。

        2
  •  4
  •   jessegavin    15 年前

        3
  •  2
  •   Community basarat    7 年前

    啊!!谢谢@GregD。我们在搜索“this*”或“never*”时没有找到字符串“this never ends”。原来 二者都

    看起来不可能在每个查询的基础上关闭此功能,但基于此: SQL 2008: Turn off Stop Words for Full Text Search Query

    我跑

    ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF
    

        4
  •  0
  •   GregD    15 年前

    你看过你的噪音词档案了吗?在我的机器上,它位于c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\FTData\noiseENG.txt

    可以测试这一点的一种方法是,只使用一个空格编辑特定的噪波文件,以便它对所有内容进行索引,然后重试查询。我会在测试环境中而不是在生产环境中“测试”它。

        5
  •  -1
  •   ScArcher2    15 年前

    你能试试吗

    SELECT * FROM Products WHERE CONTAINS(Keywords, ' "SA-300" ')
    

    我看到了一个例子,说明了你正在做什么 msdn