FullTextSearch 索引/搜索带有特殊字符的单词

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 索引特殊字符?

wBo*_*Bob 5

嗯,恐怕“#”算作标点符号,而 SQL Server 全文索引是在 Twitter 之前发明的。然而,有几种方法:

1) 预处理

使用全文函数获取大部分数据,然后使用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 万行的表上做了一些简单的测试,它似乎表现不错。天啊。

2) 列的标记化版本

存储一个替代版本,例如一个计算列,其中 '#' 被替换为文字文本 '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)

显然这里有一些存储开销。

考虑使用您的数据尝试这些方法,并告诉我您的进展情况。