2011-03-03 103 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;