我有许多领域的表。为了搜索此表中的信息,我使用全文搜索。当我尝试查找行时,在电话号码或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
有没有办法解决它? 谢谢!
答案 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)
此外,如果它尚未打开,请查看索引的后台更新。