我在ms sql server中遇到问题。我在名为“col1”的列上有一个全文索引。此列中的数据可能会非常大(20,30 kb +)。我现在想在这个专栏中搜索一个确切的短语。
我被告知“包含”功能是最快的功能,但我至少知道其他2种方法。使用“喜欢”功能,并使用“charindex”。
问题是当我搜索包含#符号的短语时,“contains”不起作用。例如,“... WHERE包含(col1,'”查询字符串#“')...”将始终返回0结果。
我已经切换到使用charindex,这确实会返回结果,但使用此函数查询数据库需要更长的时间。
有没有办法加快查询速度或让contains函数接受我的#符号?
感谢您的时间......
更新 我决定在使用charindex包含函数之间切换。因此,如果查询数据包含#符号,我们切换到使用charindex;对于所有其他查询,我使用包含。似乎工作得最好。
答案 0 :(得分:2)
我们在自己的FTS实施方面遇到了类似的问题。这是因为微软从索引程序中删除了很多特殊字符和常用字。
在我们的情况下,我们控制输入并通过一个转换特殊字符(如哈希符号)的函数传递所有文本。因此,哈希符号的数据库输入可能看起来像这个“zxzHASHyxy”。
我们可以在执行搜索时将我们翻译的版本替换为“真实”版本。
然而,这个实现有一个很大的缺点。如果您需要保留未翻译文本的副本,则必须在单独的列中执行此操作,这将导致数据库中出现大量膨胀。谨慎使用此解决方案。
答案 1 :(得分:1)
像“#”这样的特殊字符是断字符,不会包含在索引中。对于全文索引'查询字符串#xyz'看起来像'查询字符串xyz'。
您可以尝试使用FREETEXT功能:
使用FREETEXT的全文查询 比那些全文更精确 查询使用CONTAINS。 SQL Server 全文搜索引擎识别 重要的单词和短语。没有 任何一个人都有特殊的意义 保留关键字或通配符 通常有意义的字符 在指定时 参数 CONTAINS谓词。
答案 2 :(得分:0)
您是否使用LIKE运算符/谓词而不是CHARINDEX()函数执行了任何测试?我希望LIKE比CHARINDEX()更快,但我没有任何证据或文件来支持它。
此外:
答案 3 :(得分:-1)
ALTER FULLTEXT INDEX ON [dbo].[Tablename] SET STOPLIST = OFF
这有助于在contains中使用特殊字符。
示例:
select * from [dbo].[Tablename] where contains(Column_Name,'C# or C++')