2011-03-03 99 views
7

考慮到你的地方存儲在數據庫中的數據:SQL - 與LIKE操作搜索數據庫

Hello my name is Tom I like dinosaurs to talk about SQL. 
SQL is amazing. I really like SQL. 

我們要實現一個網站搜索,讓遊客進入條件並返回相關記錄。用戶可以搜索:

Dinosaurs 

和SQL:

WHERE articleBody LIKE '%Dinosaurs%' 

科佩斯罰款返回正確的記錄集。

但是,如果用戶誤拼恐龍,我們將如何應對? IE:

Dinosores 

(可憐的dino)。我們如何搜索允許拼寫錯誤?我們可以將我們在搜索中看到的常見拼寫錯誤與正確的拼寫關聯起來,然後搜索原始詞語+已糾正的詞語,但這需要很長時間才能維護。

以任何方式編程?

編輯

顯示SOUNDEX可以幫助,但任何人都可以使用同音其中輸入搜索項給我一個例子:

Dinosores wrocks 

返回記錄,而不是這樣做的:

WHERE articleBody LIKE '%Dinosaurs%' OR articleBody LIKE '%Wrocks%' 

哪個會返回squadoosh?

+0

Levenshtein距離或者探測法 – 2011-03-03 15:26:00

+1

根據您正在使用的數據庫的例子......有一些可以用來獲得一個文字「匹配」,「探測法」功能聽起來像...... – 2011-03-03 15:26:26

+0

我不認爲這可以純粹在SQL中完成。通配符搜索已經很慢了。我寧願使用像Apache Lucene或Solr這樣的成品。 – Wukerplank 2011-03-03 15:28:47

回答

4

如果您使用的SQL Server,看看SOUNDEX

對於示例:

select SOUNDEX('Dinosaurs'), SOUNDEX('Dinosores') 

返回相同的值(D526)。

您也可以使用差異函數(與soundex相同的鏈接)來比較相似度(4是最相似的,0是最小的)。

SELECT DIFFERENCE('Dinosaurs', 'Dinosores'); --returns 4 

編輯:

了一下週圍的多文本選項獵之後,似乎這並不是那麼容易。我會把你引向@Neil Knight提供的Fuzzt Logic答案的鏈接(+1,對我來說!)。

This stackoverflow article也詳細說明了TSQL中模糊邏輯實現的可能來源。一旦響應者也將全文索引概述爲您可能想要調查的潛力。

+0

你會如何將它應用於多關鍵字搜索? – 2011-03-03 15:29:34

+0

就像我說的那樣,我在搜索中輸入'dinosores wrock'(意思是恐龍搖滾)。傳統上,我會這樣做:身體像'%dinosores%'或身體像'wrock'。如何在這種情況下應用soundex,以便返回記錄? – 2011-03-03 15:33:11

+1

@詹姆斯,當articleBody被存儲時,如何存儲它的SOUNDEX版本,IE「blah blah lol」和「B32 B32 L122」。當您搜索條款時,您在soundex上搜索LIKE。這會工作嗎? – 2011-03-03 15:47:22

3

也許你的RDBMS有SOUNDEX函數?你沒有提到這裏涉及哪一個。

+0

是的,SOUNDEX看起來很棒,從未聽說過! – 2011-03-03 15:28:32

0

簡而言之,對於大多數可以做基於字典修正的「胖手指」的大多數SQL引擎,沒有任何內容。 SoundEx確實可以作爲一種工具來查找聽起來相似的單詞,從而更正拼音拼寫錯誤,但如果用戶在「Dinosars」中輸入了錯誤的最終U,或者真正「粗暴地」輸入了「Dinosayrs」,SoundEx會不會返回完全匹配。

聽起來像是你想在谷歌的搜索的水平的東西「你的意思是_ _?」特徵。我可以告訴你,這不像看起來那麼簡單。在10,000英尺的高度上,搜索引擎會查看每個關鍵字,看看它是否在已知「好」搜索字詞的「字典」中。如果不是,則它使用類似於拼寫檢查器建議的算法來查找最接近匹配的字典單詞(需要用最少的字母替換,添加,刪除和換位將給定單詞轉換成字典單詞)。這將需要一些沉重的過程代碼,無論是在數據庫中存儲的proc或CLR Db函數中,還是在業務邏輯層中。

+0

我不想模擬Google的複雜性,但只是有一個網站搜索,可以應付拼寫,因爲很多遊客來自世界各地,但感謝您的答案! – 2011-03-03 15:31:38

3

只是拋出一個替代方案。如果SSIS是一個選項,那麼你可以使用模糊查找。

SSIS Fuzzy Lookup

2

我不知道,如果引入一個單獨的「搜索引擎」是可能的,但如果你看一下產品,如谷歌搜索設備或自治,這些產品可以索引SQL數據庫,並提供更多的搜索選項 - 例如,處理拼寫錯誤以及同義詞,搜索結果的權重,可選的搜索建議等

此外,SQL Server的全文搜索功能可以配置爲使用詞庫,這可能有助於: http://msdn.microsoft.com/en-us/library/ms142491.aspx

這是從別人建立詞庫處理常見的錯別字另一個SO問題: FORMSOF Thesaurus in SQL Server

0

您也可以嘗試SubString(),以消除前3點左右的字符。下面是如何可以實現

SELECT Fname, Lname 
FROM Table1 ,Table2 
WHERE substr(Table1.Fname, 1,3) || substr(Table1.Lname,1 ,3) = substr(Table2.Fname, 1,3) || substr(Table2.Lname, 1 , 3)) 
ORDER BY Table1.Fname;