1

我遇到了SQL全文索引的一個奇怪問題。基本上我正在搜索一個用於存放電子郵件地址的列。似乎正如我所測試的所有情況一樣工作,除了一個!SQL的奇怪問題包含 - 忽略字符串的起始字符

SELECT * 
FROM Table 
WHERE CONTAINS(Email, '"[email protected]"') 

因爲這是完全無視上面的「電子郵件」一部分,而不是做

SELECT * 
FROM Table 
WHERE CONTAINS(Email, '@me.com') 

現在只有我能找到,這是發生了一個案件有一定的電子郵件地址。我重新編制了索引,但沒有喜悅。也重建目錄。

任何想法??

編輯: 我不能把某人的電子郵件地址放在公共網站上,所以我會給出更合適的例子。導致此問題的一個的形式爲:

[email protected] 

當我做

WHERE CONTAINS(Email, "'[email protected]"') 

其中返回匹配的行都是形式.*@somedomain.net.au的。即它忽略了a.b.c部分。

+2

我們展示的數據/一個簡單的 '非' 工作的例子吧。 –

+1

'WHERE Email LIKE'%email @ me.com%''工作嗎?另外,如果你正在尋找一個確切的值,爲什麼不使用等號運算符('WHERE Email ='email @ me.com')來比較它呢?在你的第一個例子中,你有單引號和雙引號,爲什麼? –

+0

已添加示例。是的,像運營商工作正常。我可能正在查找確切的值,但該列是用分號分隔的電子郵件地址列表。 – Umair

回答

2

句號在一個全文索引視爲干擾詞(或禁用詞),你可以通過檢查系統禁用詞查找排除的字符的列表:

SELECT * FROM sys.fulltext_system_stopwords WHERE LANGUAGE_ID = 2057 - - 這是英國英語的lang ID(相應地更改)

因此,您的電子郵件地址「[email protected]」實際上被視爲「[email protected]」,並且在此特定情況下因爲單個字母也被排除在索引之外,因此您最終在「@ somedomain.net.au」上搜索。

你真的有兩種選擇,你可以在索引之前替換你想包含的字符(所以用特殊標籤替換特殊字符),或者從全文阻止列表中刪除要包含的字符/字符。

NT //如果您選擇後者,我會小心謹慎,因爲這會顯着增加您的索引。

這裏有一些鏈接,可以幫助你:

Configure and Manage Stopwords and Stoplists for Full-Text Search

Create Full Text Stoplists

+0

看起來像view/table'fulltext_system_stopwords'是從2008年開始的。任何2005版本。我想最後我會用其他的東西替換完整的句號。謝謝! – Umair