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

可以很好地返回正确的记录集。

但是,如果用户拼错恐龙,我们将如何应对?IE:

Dinosores

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

任何方式编程?

编辑

似乎 SOUNDEX 可以提供帮助,但谁能给我一个使用 soundex 输入搜索词的示例:

Dinosores wrocks

返回记录而不是执行:

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

哪个会返回小队?

4

6 回答 6

4

如果您使用的是 SQL Server,请查看SOUNDEX

对于您的示例:

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

返回相同的值 (D526)。

您还可以使用 DIFFERENCE 函数(在与 soundex 相同的链接上)来比较相似度(4 表示最相似,0 表示最不相似)。

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

编辑:

在寻找多文本选项之后,似乎这并不容易。我会向您推荐@Neil Knight 提供的关于 Fuzzt Logic 答案的链接(对我来说+1!)。

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

于 2011-03-03T15:27:12.540 回答
3

也许您的 RDBMS 有一个SOUNDEX功能?你没有提到这里涉及哪一个。

于 2011-03-03T15:26:31.047 回答
3

只是为了在那里扔一个替代品。如果 SSIS 是一个选项,那么您可以使用模糊查找。

SSIS 模糊查找

于 2011-03-03T15:31:04.050 回答
3

我不确定是否可以引入单独的“搜索引擎”,但如果您查看 Google Search Appliance 或 Autonomy 等产品,这些产品可以索引 SQL 数据库并提供更多搜索选项 - 例如,还可以处理拼写错误作为同义词、搜索结果权重、替代搜索推荐等。

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

这是另一个设置词库来处理常见拼写错误的人提出的 SO 问题: SQL Server 中的FORMSOF 词库

于 2011-03-03T15:48:31.843 回答
1

简短的回答是,大多数 SQL 引擎都没有内置任何东西可以对“胖手指”进行基于字典的校正。SoundEx 确实可以作为一种工具来查找听起来相似的单词,从而纠正拼音错误,但如果用户输入“Dinosars”缺少最后一个 U,或者真正“粗手指”输入“Dinosayrs”,SoundEx 会不返回完全匹配。

听起来您想要 Google 搜索“您的意思是_ _吗?”级别的东西。特征。我可以告诉你,这并不像看起来那么简单。在 10,000 英尺的高度,搜索引擎会查看这些关键字中的每一个,看看它是否在已知“好”搜索词的“字典”中。如果不是,它使用类似于拼写检查器建议的算法来查找最接近匹配的字典单词(需要最少的字母替换、添加、删除和换位才能将给定单词转换为字典单词)。这将需要一些繁重的程序代码,无论是在数据库中的存储过程或 CLR Db 函数中,还是在业务逻辑层中。

于 2011-03-03T15:29:42.247 回答
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;
于 2013-04-19T02:05:54.593 回答