【发布时间】:2009-12-08 22:04:55
【问题描述】:
我想让用户能够搜索大量企业列表,但仍能找到近似匹配项。
如果您的目标不是简单的字典单词,而是像 ABC 公司名称这样的复杂名称,是否有人对如何最好地解决这个问题有任何建议?
问候。
【问题讨论】:
-
我同意。我钦佩我的软件工程师同事的知识深度,所有这些答案都是很好的线索。
标签: c# sql-server asp.net-mvc
我想让用户能够搜索大量企业列表,但仍能找到近似匹配项。
如果您的目标不是简单的字典单词,而是像 ABC 公司名称这样的复杂名称,是否有人对如何最好地解决这个问题有任何建议?
问候。
【问题讨论】:
标签: c# sql-server asp.net-mvc
查看Levenshtein distance 上的维基百科文章。这是一个相当简单的概念,可以让您轻松理解,并且很容易用您使用的任何语言(在您的情况下为 C#)实现算法。
我在 C# 中为您找到了一个示例 here。
此外,here 是来自 Google 的 Peter Norvig 的拼写纠正器示例。前几集的 SO 播客上说过 Jon Skeet 试图用 C# 重写相同的算法。不确定他是否完成了它和/或将其公开。
【讨论】:
考虑使用关键字匹配和编辑基于距离的相似性。可能与“原始搜索”结合为“实际点击”。
【讨论】:
这可能是一个疯狂的解决方案,但您能否将公司名称按空格分开,然后搜索所有项目或前几项。
因此,您可以搜索“ABC”和“企业”,但忽略“名称”,因为这可能需要很长时间。
您甚至可以检查字符串是否具有特定长度,然后修剪并仅搜索前 5 个字母。
您是否查看过“soundex”作为搜索您的业务的一种方式。同样,我认为您需要用空格分隔名称。
【讨论】:
您可以查看 SQL Server SOUNDEX 和 DIFFERENCE 函数。 SOUNDEX 将一个字符序列(例如一个单词)转换为一个 4 字符的代码,这对于发音相似的单词是相同的。 DIFFERENCE 给出一个数字,表示两个字符串基于声音的“不同”程度。
例如,您可以基于 SOUNDEX 函数创建一个计算列,然后在该列上进行匹配。或者您可以在 WHERE 子句中使用 DIFFERENCE。
【讨论】: