全文搜索CONTAINSTABLE

时间:2012-02-03 13:22:24

标签: sql sql-server sql-server-2008 tsql

我有许多领域的表。为了搜索此表中的信息,我使用全文搜索。当我尝试查找行时,在电话号码或Skype名称字段中存在三个零,我也有正确的记录,获取包含带点和数字的字符串的记录(例如,字符串.87)

我使用下面的查询

DECLARE @SearchCondition nvarchar(100) = '"000*"'

SELECT e.Id, e.FirstName, e.LastName, e.PhoneNumber, e.SkypeName
FROM dbo.Employee e
    INNER JOIN CONTAINSTABLE([dbo].[Employee], *, @SearchCondition, Language 0) as fti ON e.Id = fti.[KEY]

我得到以下结果:

Id  FirstName   LastName     PhoneNumber    SkypeName
14  name1       name1      3903749282      000skypename
20  name90      name.90    3906773464      skypename_str
21  name2       name2      3906769539      skypename.87

有没有办法解决它? 谢谢!

2 个答案:

答案 0 :(得分:5)

您可以在断字符完成后查看搜索字词的内容:

SELECT display_term FROM sys.dm_fts_parser('"000*"', 0, NULL, 0);

获取:

000
nn0

(有关文档,请参阅http://msdn.microsoft.com/en-us/library/cc280463.aspx。)

第二个术语0是您为分词系统指定的语言。您正在指定中性断字符,它似乎会舍入多个零。

将其改为英文(1033):

SELECT display_term FROM sys.dm_fts_parser('"000*"', 1033, NULL, 0);

...使查询执行您想要的操作,但是您可能有其他原因使用语言0.如果您未在CONTAINSTABLE中指定语言,则它使用列索引的语言。

确实

CONTAINSTABLE([dbo].[Employee], *, @SearchCondition)

..为你工作?

修改

在有点鬼混之后,看起来中性断字符试图用科学记数法找到数字参数:

SELECT * FROM sys.dm_fts_parser('850000000000000', 0, NULL, 0);

850000000000000
nn8d5e+014

答案 1 :(得分:2)

如果您不想匹配除PhoneNumber和SkypeName之外的列中的数据,请将列中的列从“*”更改为您想要的列。

CONTAINSTABLE([dbo].[Employee], (PhoneNumber, SkypeName), @SearchCondition, Language 0)

此外,如果它尚未打开,请查看索引的后台更新。