2009-02-25 71 views
13

我在SQL Server數據庫中有一個Products表,並且我不得不排除使用全文索引的傳統存儲過程的故障。爲了我們的目的,假設Products表中有兩個字段ID,關鍵字。關鍵字字段填入以下內容:SQL問題:使用CONTAINS()不起作用,但LIKE正常工作

ROLAND SA-300此Roland SA-300在MINT條件下爲 !

當我運行下面的語句,我能夠檢索記錄:

SELECT * FROM Products WHERE Keywords LIKE '%SA-300%' 

然而,當我運行任何下面的語句,我得到結果爲零:

SELECT * FROM Products WHERE CONTAINS(Keywords, ' SA-300 ') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA-300') 
SELECT * FROM Products WHERE CONTAINS(Keywords, '"SA-300"') 
SELECT * FROM Products WHERE CONTAINS(Keywords, '"*SA-300*"') 

但我知道CONTAINS()函數正在工作,因爲當我運行以下任何一個時,我會得到結果:

SELECT * FROM Products WHERE CONTAINS(Keywords, ' Roland ') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'Roland') 
SELECT * FROM Products WHERE CONTAINS(Keywords, '"Roland"') 
SELECT * FROM Products WHERE CONTAINS(Keywords, '"*Roland*"') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'Roland') 

我需要弄清楚爲什麼CONTAINS()函數不適用於'SA-300'這個術語。我是全新索引的新手,所以任何幫助表示讚賞。

+2

沒有線索,但你檢查過索引是最新的嗎? – MichaelGG 2009-02-25 22:01:21

回答

13

兩個想法:

(1)連字符可以被視爲一個詞打破 做這些回報?

SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA 300') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA300') 

看到這個other question

(2)你有沒有試過重建你的全文索引?它有可能過時了。

-1

你可以嘗試

SELECT * FROM Products WHERE CONTAINS(Keywords, ' "SA-300" ') 

我看到你正在嘗試對msdn做榜樣。

+2

從他的問題中,他嘗試了。 – GregD 2009-02-25 22:06:04

+0

我不知道白色空間是否重要。我猜不會。 – ScArcher2 2009-02-25 22:17:11

0

你有沒有看過你的噪音詞文件?在我的機器上,它位於這裏c:\ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ FTData \ noiseENG.txt

您可以測試這種方法的一種方法是編輯您的特定噪聲文件只有一個空格以便它索引所有內容並再次嘗試查詢。我會在測試環境中「測試」它,而不是在生產環境中測試。

4

原來,我需要重新構建我的全文索引。感謝提示@MichaelGG和@JohnFx

1

啊!謝謝@GregD。當查找「this *」或「never *」時,我們搜索時未找到字符串「this never ends」。原來單詞在noiseENG.txt。

它看起來並不像它可能關閉這個功能在每次查詢的基礎,但在此基礎上: SQL 2008: Turn off Stop Words for Full Text Search Query

我跑

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF 

,我們開始收到效果,我們通緝。

相關問題