2011-08-09 27 views
2

我有一個搜索查詢需要由用戶輸入的短語,應返回結果,這裏有一個例子:CONTAINSTABLE通配符在短語匹配上失敗?

SELECT rank,[KEY] FROM CONTAINSTABLE(tblproduct, (title,subtitle,publisher_name), @search_text,15) 

哪裏@search_text是

Set @search_text = '"my favourite word*"' 

這句話,因爲它與數據庫中的圖書完全匹配。但是,通配符(*)使得它不會返回任何結果。

當我省略通配符時,我得到一個精確的詞組匹配,但是,其他一些詞組,例如「The Imperfectionists」不帶任何通配符返回任何結果。

這是爲什麼?我可以檢查什麼?

目前,如果沒有爲通配符生成結果集,我運行沒有通配符的查詢來查看它是否返回任何內容。如果這也失敗了,我運行一個正常的「喜歡」的聲明。

顯然類似聲明將採取永遠......我不想使用它爲數字應與全文進行搜索的760萬,強大的數據庫...

任何幫助表示讚賞!

回答

2

使用JStead的建議,我查看了字符串的輸出。我也發現了這個在MSDN:

當是一個短語,包含一語中的每個詞 視爲一個單獨的前綴。因此,指定 前綴術語「本地葡萄酒*」的查詢匹配任何具有「本地 酒莊」,「本地贏得和用餐」等文本的行。

因此,My這個詞在默認情況下被認爲是「噪音詞」。添加*會導致解析器查找以My開頭的任何單詞。但是,在搜索索引時,單詞My似乎已被刪除(請記住,它是一個噪音詞),因此它找不到匹配項。

我正在考慮在添加*之前通過sys.dm_fts_parser函數運行搜索字符串,刪除噪音字。

+0

好的,這是有道理的,因爲我已經注意到sys.dm_fts_parser顯示「完全匹配」沒有*和「噪音詞」與*(或者它是相反的方式,不確定)。但是,我的「解決方法」是在沒有返回結果集時添加通配符。而且它似乎正在工作'好吧'。雖然並不理想,但我會考慮使用fts_parser並在添加*之前先濾除噪音詞,但是我擔心我會得到和現在一樣的結果 – user85569

+0

yea,it另一種方式。當我使用它時,我認爲它是完全匹配的(使用fts_parser),當我使用它時沒有使用噪音詞(很可能爲什麼我在沒有通配符的情況下匹配確切的短語匹配)。 – user85569

+0

我正在評估這一點。但是,我想指出的是,JStead也爲答案提供了很多幫助。我想現在我明白了全文索引如何索引搜索條件,以及爲什麼通配符在完全匹配時沒有結果。 – user85569

1

有一個sys函數,告訴你如何微軟將搜索你放入的術語。這將告訴你它將要搜索的所有單詞。使用以下

SELECT * FROM sys.dm_fts_parser (' "my favourite word*" ', 1033, 0, 0) 

欲瞭解更多有關此功能http://msdn.microsoft.com/en-us/library/cc280463.aspx

而不是使用*你將要更新詞庫給你我最喜歡的單詞的所有可能的極變化。