SQL - 使用LIKE运算符搜索数据库

8

假设您的数据存储在数据库中:

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%'

能够正确返回记录集。

但如果用户拼错了dinosaur应该怎么办呢?例如:

Dinosores

(可怜的恐龙)。我们如何在搜索时允许拼写错误?我们可以将搜索中常见的拼写错误与正确的拼写相关联,然后在原始术语+更正术语上进行搜索,但这需要耗费时间来维护。

有没有编程的方法?

编辑

似乎SOUNDEX可以帮助,但是有人可以给我一个使用soundex的例子吗,其中输入搜索词:

Dinosores wrocks

返回记录而不是执行:
WHERE articleBody LIKE '%Dinosaurs%' OR articleBody LIKE '%Wrocks%'

会返回什么东西?


Levenshtein距离或Soundex - Mitch Wheat
1
根据您使用的数据库不同,可以使用“Soundex”函数来获取发音相似的单词的“匹配”。 - John K.
我认为这个纯粹使用SQL无法完成。通配符搜索已经很慢了。我宁愿使用像Apache Lucene或Solr这样的成品。 - Wukerplank
6个回答

5
如果你正在使用SQL Server,请查看SOUNDEX
针对您的示例:
select SOUNDEX('Dinosaurs'), SOUNDEX('Dinosores')

返回相同的值 (D526)。
您还可以使用 DIFFERENCE 函数(与 soundex 相同的链接上)来比较相似性级别(4 表示最相似,0 表示最不相似)。
SELECT DIFFERENCE('Dinosaurs', 'Dinosores'); --returns 4

编辑:

在寻找多文本选项时,似乎这并不那么容易。我建议您参考Fuzzt Logic答案中@Neil Knight提供的链接(对我来说是+1!)。

此stackoverflow文章 还详细介绍了在TSQL中实现模糊逻辑的可能来源。一个回应者还概述了全文索引作为您可能想要调查的潜力。


你如何将这个应用到多关键字搜索中? - Tom Gullen
假设我输入搜索词“恐龙摇滚”(意思是dinosaurs rock),传统上我会这样写:WHERE body LIKE '%dinosores%' OR body LIKE 'wrock'。如何在这种情况下应用soundex,以便返回记录? - Tom Gullen
1
@James,当articleBody被存储时,它会存储其SOUNDEX版本,例如“blah blah lol”和“B32 B32 L122”。当您搜索术语时,您会在SOUNDEX上进行LIKE搜索。这种方法是否有效? - Tom Gullen
我认为这个问题已经解决了!不过我会提出一个新的问题,因为这很有趣。 - Tom Gullen
@James:你肯定可以给我点赞+1;-) - Neil Knight

3

也许你的关系型数据库管理系统有 SOUNDEX 函数?你没有提到具体是哪个数据库。


是的,它会的。SOUNDEX看起来很棒,以前从未听说过! - Tom Gullen

3

只是提供一种替代方案。如果可以使用SSIS,您可以使用Fuzzy Lookup。

SSIS Fuzzy Lookup


3
我不确定是否引入一个单独的“搜索引擎”是可能的,但是如果您看一下像Google搜索设备或Autonomy这样的产品,这些产品可以索引SQL数据库并提供更多的搜索选项 - 例如,处理拼写错误以及同义词、搜索结果加权、替代搜索建议等。

此外,SQL Server的全文搜索功能可以配置使用词库,这可能会有所帮助: http://msdn.microsoft.com/en-us/library/ms142491.aspx

这里还有另外一个SO问题,有人设置了一个词库来处理常见的拼写错误:FORMSOF Thesaurus in SQL Server


1

简短回答,大多数SQL引擎中没有内置的基于字典的“手残”纠正工具。SoundEx可以作为一种工具来查找听起来相似的单词,从而纠正语音拼写错误,但如果用户输入了“Dinosars”缺少最后一个U,或者真正的“手残”并输入了“Dinosayrs”,SoundEx将不会返回完全匹配。

听起来你想要类似于Google搜索的“Did you mean __?”功能。我可以告诉你,这并不像看起来那么简单。在10,000英尺的高度上,搜索引擎将查看每个关键字,并查看它是否在已知的“好”的搜索术语的“字典”中。如果不是,则使用类似于拼写检查建议的算法来查找与之最接近的字典单词(需要最少的字母替换、添加、删除和转置,以将给定单词变成字典单词)。这将需要一些重型过程代码,可以在数据库中的存储过程或CLR Db函数中,也可以在业务逻辑层中实现。


我并不想模拟谷歌的复杂性,只是想要一个能够处理来自世界各地访问者的拼写的站点搜索,但还是感谢您的回答! - Tom Gullen

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接