SQL Server:'contains'vs'charindex'

时间:2009-05-12 13:22:09

标签: sql-server full-text-search

我在ms sql server中遇到问题。我在名为“col1”的列上有一个全文索引。此列中的数据可能会非常大(20,30 kb +)。我现在想在这个专栏中搜索一个确切的短语。

我被告知“包含”功能是最快的功能,但我至少知道其他2种方法。使用“喜欢”功能,并使用“charindex”。

问题是当我搜索包含#符号的短语时,“contains”不起作用。例如,“... WHERE包含(col1,'”查询字符串#“')...”将始终返回0结果。

我已经切换到使用charindex,这确实会返回结果,但使用此函数查询数据库需要更长的时间。

有没有办法加快查询速度或让contains函数接受我的#符号?

感谢您的时间......

更新 我决定在使用charindex包含函数之间切换。因此,如果查询数据包含#符号,我们切换到使用charindex;对于所有其他查询,我使用包含。似乎工作得最好。

4 个答案:

答案 0 :(得分:2)

我们在自己的FTS实施方面遇到了类似的问题。这是因为微软从索引程序中删除了很多特殊字符和常用字。

在我们的情况下,我们控制输入并通过一个转换特殊字符(如哈希符号)的函数传递所有文本。因此,哈希符号的数据库输入可能看起来像这个“zxzHASHyxy”。

我们可以在执行搜索时将我们翻译的版本替换为“真实”版本。

然而,这个实现有一个很大的缺点。如果您需要保留未翻译文本的副本,则必须在单独的列中执行此操作,这将导致数据库中出现大量膨胀。

谨慎使用此解决方案。

答案 1 :(得分:1)

像“#”这样的特殊字符是断字符,不会包含在索引中。对于全文索引'查询字符串#xyz'看起来像'查询字符串xyz'。

您可以尝试使用FREETEXT功能:

  

使用FREETEXT的全文查询   比那些全文更精确   查询使用CONTAINS。 SQL Server   全文搜索引擎识别   重要的单词和短语。没有   任何一个人都有特殊的意义   保留关键字或通配符   通常有意义的字符   在指定时    参数   CONTAINS谓词。

答案 2 :(得分:0)

您是否使用LIKE运算符/谓词而不是CHARINDEX()函数执行了任何测试?我希望LIKE比CHARINDEX()更快,但我没有任何证据或文件来支持它。

此外:

  • 是#符号本身在查询中实际上很重要?
  • 如果是,你可以使用一个两阶段的事情,你使用SQL的CONTAINS()来检索包含查询字符串(有或没有#)的所有记录的列表,然后进行应用程序端测试删除没有#?
  • 的条目

答案 3 :(得分:-1)

ALTER FULLTEXT INDEX ON  [dbo].[Tablename]  SET STOPLIST = OFF

这有助于在contains中使用特殊字符。

示例:

 select * from  [dbo].[Tablename] where contains(Column_Name,'C# or C++')