2010-03-12 44 views
2

我的一個客戶端掛鉤了多列子字符串匹配。SQL Server - 多列子字符串匹配

據我所知,ContainsFreeText搜索單詞(至少在包含單詞前綴的情況下)。但是,根據我對MSDN書籍this的理解,這些或它們的變體都無法搜索子字符串。

我用LIKE相當廣泛(SELECT * FROM A,其中AB LIKE '%SUBSTR%')

樣品表答:

ID | Col1  | Col2  | Col3  | 
------------------------------------- 
1 | oklahoma | colorado | Utah  | 
2 | arkansas | colorado | oklahoma | 
3 | florida | michigan | florida | 
------------------------------------- 

下面的代碼將會給我們行1和行2 :

select * from A where Col1 like '%klah%' or Col2 like '%klah%' or Col3 like '%klah%' 

這相當醜陋,可能很慢,我只是不太喜歡它。可能是因爲我正在處理的實現有10多列需要搜索。

隨着代碼可讀性的提高,以下可能會有所改善,但就性能而言,我們仍然處於同一個球場。

select * from A where (Col1 + ' ' + Col2 + ' ' + Col3) like '%klah%' 

我曾經想過簡單地增加插入,更新和刪除觸發器只需添加上述列的級聯版本到一個單獨的表陰影此表。

樣品Shadow_Table:

ID | searchtext     | 
--------------------------------- 
1 | oklahoma colorado Utah  | 
2 | arkansas colorado oklahoma | 
3 | florida michigan florida | 
--------------------------------- 

這將使我們能夠進行下面的查詢搜索「%klah%」

select * from Shadow_Table where searchtext like '%klah%' 

我真的不喜歡要記住,這個陰影表存在,我應該在執行多列子字符串匹配時使用它,但它可能會以寫入和存儲空間爲代價產生相當快的讀取。

我的直覺告訴我,SQL Server 2008內置了一個現有的解決方案。但是,除了關於這個主題的研究論文之外,我似乎沒有找到任何其他的東西。

任何幫助,將不勝感激。

+0

查看全文搜索(FTS) – 2010-03-12 23:29:44

+1

我有。上面鏈接的MSDN書提示,全文搜索是一種基於詞的搜索,它還能夠使用同義詞庫來匹配接近搜索詞的單詞或表示相同內容的單詞。我解釋錯了嗎? – 2010-03-12 23:36:40

回答

1

從您的描述中可以看出,您正在尋找一種方法來改善精確搜索。 LIKE是在嘗試查找與您的字符串完全匹配的字符串時使用的正確工具。如果你擔心表現,比你應該考慮索引,甚至像你所描述的自定義索引。

也許考慮持續計算列而不是影子表。插入/更新的開銷應小於使用觸發器,並且查詢時間可能相當。

全文本搜索

全文搜索被設計爲一個自然語言搜索。

從最終用戶的角度考慮。如果我在搜索「俄克拉荷馬州」,我可能會以「okla」或「ok」或「oklahoma」開頭。我不會搜索「homa」。這是我們人類思維的方式。因此,「自然」的語言搜索。

自然語言搜索使用根莖和類似的詞來增加結果的總數。但是,如果您希望所有結果都與您的搜索字詞具體匹配,則不是最理想的。即使沒有特別出現的單詞,自由文本將匹配「我開車上課」和「駕駛和課程」。

+0

我認爲在這裏使用持久計算列比使用影子表要優雅得多。事實上,我可以將它命名爲需要這種特定類型搜索的所有表格。此外,感謝您對全文搜索的解釋。對於任何面向網絡的搜索,我都可以看到它非常有用。但是,在像我這樣的情況下,我們將搜索確切的記錄,例如姓名和街道名稱,所以我更願意使用子字符串進行精確搜索。如果速度太慢,我可以重新進行全文搜索。謝謝! – 2010-03-13 00:49:24