【问题标题】:SQL - searching database with the LIKE operatorSQL - 使用 LIKE 运算符搜索数据库
【发布时间】:2011-07-08 03:38:15
【问题描述】:

鉴于您的数据存储在数据库中的某处:

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

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

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

Dinosores

(可怜的恐龙)。我们如何搜索允许拼写错误?我们可以将我们在搜索中看到的常见拼写错误与正确的拼写相关联,然后搜索原始词+更正词,但这很耗时。

任何编程方式?

编辑

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

Dinosores wrocks

返回记录而不是做:

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

哪个会返回小队?

【问题讨论】:

  • levenshtein 距离或 Soundex
  • 取决于您使用的数据库...有“Soundex”函数可用于在听起来相似的单词上获得“匹配”...
  • 我认为这不能纯粹在 SQL 中完成。通配符搜索已经很慢了。我宁愿使用像 Apache Lucene 或 Solr 这样的成品。

标签: sql sql-like spelling


【解决方案1】:

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

你的例子:

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

返回相同的值 (D526)。

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

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

编辑:

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

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

【讨论】:

  • 如何将其应用于多关键字搜索?
  • 就像说我在搜索中输入了“dinosores wrock”(意思是恐龙摇滚)。传统上我会这样做:身体喜欢'%dinosores%'或身体喜欢'wrock'。在这种情况下如何应用 soundex 以便它返回记录?
  • @James,在存储 articleBody 时如何存储它的 SOUNDEX 版本,即“blah blah lol”和“B32 B32 L122”。当您搜索术语时,您会在 soundex 上搜索 LIKE's。这会很好用吗?
  • 我认为这已经解决了!不过我会提出一个新问题,因为这很有趣。
  • @James:你当然可以 +1 我 ;-)
【解决方案2】:

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

【讨论】:

  • 是的,SOUNDEX 看起来很棒,以前从未听说过!
【解决方案3】:

只是为了抛出一个替代方案。如果 SSIS 是一个选项,那么您可以使用模糊查找。

SSIS Fuzzy Lookup

【讨论】:

    【解决方案4】:

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

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

    这是另一个来自设置同义词库以处理常见拼写错误的 SO 问题: FORMSOF Thesaurus in SQL Server

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 我不想模拟谷歌的复杂性,但只是有一个可以处理拼写的网站搜索,因为很多访问者来自世界各地,但感谢您的回答!
      【解决方案6】:

      你也可以试试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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-20
        • 1970-01-01
        • 2018-11-02
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 2019-08-24
        相关资源
        最近更新 更多