2012-02-03 90 views
1

我有很多領域的表。爲了在此表中搜索信息,我使用全文搜索。當我嘗試查找行時,在電話號碼或Skype名稱字段中存在三個零的情況下,I也具有正確的記錄,獲得包含一些帶有點和數字的字符串的記錄(例如string.87)全文搜索CONTAINSTABLE

I使用下面的查詢

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 

有沒有辦法解決呢? 謝謝!

回答

5

你可以看到你的搜索詞是什麼樣子的分詞與它這樣做後:

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

獲取:(用於文檔見http://msdn.microsoft.com/en-us/library/cc280463.aspx

000 
nn0 

第二項0是您爲分詞器指定的語言。您正在指定中性詞斷開器,它似乎舍入了多個零。

將其更改爲英語(1033):

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

...使查詢你想要做什麼,但你可能有其他原因使用的語言0。如果你不指定語言在CONTAINSTABLE,它採用了柱在索引的語言。

是否

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

..work適合你?

編輯

後周圍有點嘴硬,它看起來像中性斷試圖還會發現在科學記數法的數值參數:

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

850000000000000 
nn8d5e+014 
1

如果您不想匹配PhoneNumber和SkypeName以外的列的數據,請將'*'中的列更改爲所需的列。

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

此外,如果它尚未開啓,請查看索引的後臺更新。