2015-05-21 34 views
1

我在SQL Server 2008r2上遇到了使用CONTAINS函數未返回完全相同字符串匹配的問題。我很確定我誤解了CONTAINS的一些內容。Transact SQL CONTAINS不匹配具有通配符的相同字符串

我已經設置了以下測試用例來複制它。

CREATE TABLE texttest 
(
    loldex INT PRIMARY KEY IDENTITY,   
    testcolumn NVARCHAR(255) 
) 

GO 

INSERT INTO texttest 
VALUES('2ND ACADEMY OF NATURAL SCIENCES') 

GO 

CREATE UNIQUE INDEX ui_loldex ON [texttest](loldex); 
CREATE FULLTEXT INDEX ON [texttest]([testcolumn]) 
KEY INDEX ui_loldex 

CREATE FULLTEXT CATALOG ft AS DEFAULT; 

GO 

然後我運行下面的查詢:

SELECT [testcolumn] 
FROM [texttest] 
WHERE CONTAINS(testcolumn, '"2ND ACADEMY OF NATURAL SCIENCES*"') 

而且它沒有返回。

但是,如果我運行:

SELECT [testcolumn] 
FROM [texttest] 
WHERE CONTAINS(testcolumn, '"2ND ACADEMY*"') 

它返回的行。

如果我在通配符Y之後的字符串中使用更多的字符,我什麼也得不到。

如果我刪除了通配符,我從相同的字符串中得到該行。但是,我已經嘗試了與其他字符串的通配符,它​​的工作正常。據我所知,通配符代表0個或更多的附加字符,所以我不明白爲什麼它在這種情況下不起作用。

任何想法,我在這裏失蹤?

+0

它應該如你期望的那樣發現它,但是perh aps在Y之後實際上有一個雙倍的空間。將數據庫中的值複製到記事本中,並確認您只有一個空格。其實請檢查以確保每個單詞之間有一個單獨的空格。 – Elijah

+0

我已經檢查過了。實際上,我通過將表格直接從表格中剪切並粘貼到搜索中來執行搜索,但仍然失敗。 – CodingUnderDuress

+0

您是否嘗試過使用'%'而不是'*'?考慮到CONTAINS是一種模糊匹配方法,爲什麼還需要通配符? – PaulFrancis

回答

1

這是因爲of是干擾詞,也不會選擇的結果,如果你搜索stopwords。你可以看到所有停止詞:

select ssw.stopword, slg.name 
    from sys.fulltext_system_stopwords ssw 
    join sys.fulltext_languages slg on slg.lcid = ssw.language_id 
where slg.name = 'English' 

你可以把它關掉你的表:

ALTER FULLTEXT INDEX ON [texttest] SET STOPLIST = OFF 

您可以管理stoplistsstopwordshttps://technet.microsoft.com/en-us/library/ms142551(v=sql.110).aspx

例如:

stopword name 
must  English 
my   English 
never  English 
no   English 
now   English 
of   English 
on   English 
only  English 
or   English 
other  English 
our   English 
out   English 
over  English 
re   English 
+0

只要好奇,如果我忽略停止詞--'',並搜索'Where CONTAINS(testcolumn,'2ND ACADEMY * NATURAL SCIENCES'''),這仍然不起作用。 – PaulFrancis

+1

@PaulFrancis,沒有這個詞。有前綴術語但沒有後綴術語。有關詳細信息,請參閱https://msdn.microsoft.com/en-us/library/ms187787.aspx –

+0

輝煌,謝謝。我是(MS)SQL的新手。感謝。 – PaulFrancis

0

使用freetext功能來搜索你的情況整句話:

SELECT [testcolumn] 
FROM [texttest] 
WHERE freetext(testcolumn,'"2ND ACADEMY OF NATURAL SCIENCES*"') 

輸出:

testcolumn 
2ND ACADEMY OF NATURAL SCIENCES