【问题标题】:Ideas for creating a "Did you mean XYZ" feature into website在网站中创建“您的意思是 XYZ”功能的想法
【发布时间】:2009-12-08 22:04:55
【问题描述】:

我想让用户能够搜索大量企业列表,但仍能找到近似匹配项。

如果您的目标不是简单的字典单词,而是像 ABC 公司名称这样的复杂名称,是否有人对如何最好地解决这个问题有任何建议?

问候。

【问题讨论】:

  • 我同意。我钦佩我的软件工程师同事的知识深度,所有这些答案都是很好的线索。

标签: c# sql-server asp.net-mvc


【解决方案1】:

查看Levenshtein distance 上的维基百科文章。这是一个相当简单的概念,可以让您轻松理解,并且很容易用您使用的任何语言(在您的情况下为 C#)实现算法。

我在 C# 中为您找到了一个示例 here

此外,here 是来自 Google 的 Peter Norvig 的拼写纠正器示例。前几集的 SO 播客上说过 Jon Skeet 试图用 C# 重写相同的算法。不确定他是否完成了它和/或将其公开。

【讨论】:

  • 好东西。我将对其进行调整,以将 SQL 服务器端作为存储过程进行操作,以获得最佳性能,并且仅在没有匹配项时使用它。感谢您的洞察力。
  • 作为更新,这已在 C# 中实现 codegrunt.co.uk/2010/11/02/…
【解决方案2】:

考虑使用关键字匹配和编辑基于距离的相似性。可能与“原始搜索”结合为“实际点击”。

【讨论】:

    【解决方案3】:

    这可能是一个疯狂的解决方案,但您能否将公司名称按空格分开,然后搜索所有项目或前几项。

    因此,您可以搜索“ABC”和“企业”,但忽略“名称”,因为这可能需要很长时间。

    您甚至可以检查字符串是否具有特定长度,然后修剪并仅搜索前 5 个字母。

    您是否查看过“soundex”作为搜索您的业务的一种方式。同样,我认为您需要用空格分隔名称。

    【讨论】:

      【解决方案4】:

      您可以查看 SQL Server SOUNDEXDIFFERENCE 函数。 SOUNDEX 将一个字符序列(例如一个单词)转换为一个 4 字符的代码,这对于发音相似的单词是相同的。 DIFFERENCE 给出一个数字,表示两个字符串基于声音的“不同”程度。

      例如,您可以基于 SOUNDEX 函数创建一个计算列,然后在该列上进行匹配。或者您可以在 WHERE 子句中使用 DIFFERENCE。

      【讨论】:

      • 你也可以用谷歌搜索 MetaPhone,它基本上是 Soundex 的一个更复杂的版本。 Soundex 实际上是在 1918 年创建的,是一种非常简单/基本的算法。 Metaphone 通常会提供更好的匹配,但不是内置在 SQL 中,尽管周围有许多 T-SQL 版本
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多