Nik*_*tev 4 sql-server full-text-search sql-server-2014
我正在尝试为主题标签查询 FullTextSearch 索引列
SELECT Bio FROM Users
WHERE CONTAINS (Bio,'promoter')
SELECT Bio FROM Users
WHERE CONTAINS (Bio,'#promoter')
Run Code Online (Sandbox Code Playgroud)
两个结果都返回相同的记录
promoter of #Art
Run Code Online (Sandbox Code Playgroud)
我还尝试在搜索词周围加上双引号,"#promoter"
但结果相同。
当我搜索时出现同样的问题 '@something'
我需要做什么才能使 FullTextSearch 索引特殊字符?
嗯,恐怕“#”算作标点符号,而 SQL Server 全文索引是在 Twitter 之前发明的。然而,有几种方法:
使用全文函数获取大部分数据,然后使用Like
,例如
SELECT Id
INTO #tmp
FROM dbo.Users
WHERE CONTAINS ( Bio, '#promoter' )
SELECT *
FROM dbo.Users u
WHERE u.Bio Like '%#promoter%'
AND EXISTS ( SELECT * FROM #tmp t WHERE u.Id = t.Id )
Run Code Online (Sandbox Code Playgroud)
虽然您可以使用CONTAINSTABLE
在一个查询中做同样的事情,但您不一定能保证计划将采用什么顺序 - 为什么会这样,T-SQL 毕竟是声明性的。我更喜欢明确,但如果您发现性能可以接受和/或数据量很低,请将两者结合起来,例如
SELECT *
FROM dbo.Users u
INNER JOIN CONTAINSTABLE ( Users, Bio, '"#promoter"' ) ct ON u.Id = ct.[key]
WHERE u.Bio Like '%#promoter%'
Run Code Online (Sandbox Code Playgroud)
我在一个 100 万行的表上做了一些简单的测试,它似乎表现不错。天啊。
存储一个替代版本,例如一个计算列,其中 '#' 被替换为文字文本 'hashtag',如下所示:
-- Add computed column
ALTER TABLE dbo.Users ADD cleanBio AS REPLACE ( Bio, '#', 'hashtag' )
-- Add the computed column to full-text index
ALTER FULLTEXT INDEX ON dbo.Users ADD ( cleanBio )
GO
SELECT * FROM dbo.Users
WHERE CONTAINS ( cleanBio, 'hashtagpromoter' )
Run Code Online (Sandbox Code Playgroud)
显然这里有一些存储开销。
考虑使用您的数据尝试这些方法,并告诉我您的进展情况。