6

这是我的问题。例如,我有一个表Products,其中包含一个字段Name

Products
ID | Name | ..
1  | "USB Key 10Go"
2  | "Intel computer"
3  | "12 inches laptop computer"
...

我目前正在为 iPhone 网络应用程序实现一个简单的搜索引擎(SQL Server 和 ASP .NET、C#),我想使用SOUNDEX()SQL Server 函数。

问题是,我不能直接SOUNDEXName字段上使用。(这将无关紧要,因为名称中有几个单词。)我想将该函数应用于名称SOUNDEX字段中的每个单词,然后查看其中是否有任何与研究的关键字匹配。

如果有人知道如何做到这一点,那就太棒了。

4

5 回答 5

5

与其使用 Soundex,不如计算两个字符串之间的 Levenshtein 距离。请参阅有关 Levenshtein 距离的 Wikipedia 文章

这里有 Levenshtein 距离算法的 TSQL 实现。

分享和享受。


编辑 2012 年 5 月 3 日

自从写下我的原始回复以来,我了解到 Oracle 在 UTL_MATCH 包中包含 Levenshtein 距离和其他几个“字符串相似性”函数,我认为这是数据库的标准部分。文档在这里。可能与原始帖子(针对 SQL Server)没有直接关系,但可能很有用,因为许多商店使用多个数据库。

于 2009-12-17T17:52:07.443 回答
4

您是否研究过 SQL Server 中的全文搜索功能?我知道这不是你所要求的。只是 SOUNDEX() 函数用于查找相似的 SOUNDING 名称(例如:SMITH 和 SMYTHE 听起来相同)。然而,在搜索引擎中,一个词的发音方式不如搜索词本身重要。全文搜索还允许您使用同义词(允许您指定在应用程序上下文中表示相同含义的某些词),并在搜索过程中自动考虑它们。

查看这些页面以获取有关 SQL Server 中的全文搜索的更多信息:

全文搜索简介

包含

包含稳定的

自由文本

自由文本

于 2009-12-17T18:14:14.180 回答
2

如果您必须在 RDBMS 中完成所有操作,那么UDF将是最好的选择。

否则,您可以使用此技术至少使用PARSENAME分别对前四个单词进行 soundex :

如何拆分字符串以便可以访问项目 x?

PARSENAME(REPLACE('12 inches laptop computer', ' ', '.'), 1)  --return computer
PARSENAME(REPLACE('12 inches laptop computer', ' ', '.'), 2)  --return laptop
...

但是:以这种方式使用 PARSENAME 是一种 hack,一个严重的限制是它最多只能用于 4 个部分。如果有 5 个或更多单词 PARSENAME 将返回 NULL,因此您必须使用条件检查并优雅地降级。

这是一个简化的示例(同样,没有 NULL 检查)

SELECT *
FROM Products 
WHERE SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 4))
  OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 3))
  OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 2))
  OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 1))
于 2009-12-17T18:17:10.403 回答
1

SOUNDEX可能非常适合您的目的,但请记住,除了英式或美式英语口语之外,它可能无法提供任何好的结果!它甚至可以用于德语语音口语,但它不适用于其他任何东西。

于 2009-12-30T10:32:04.173 回答
1

您可以尝试存储与连字符连接的每个单词的变音位。EGstored_metaphone字段可能包含类似“-AKTRF-SPLS-”的内容。然后构建一个这样的查询:

$where = '(';
$search_sql = array();
$search_terms = explode(' ',$search);
foreach ($search_terms as $term) {
    $search_sql[] = "`stored_metaphone` LIKE '%-".metaphone($term)."-%'";
}
$where .= implode(' OR ',$search_sql);
$where .= ')';

注意这只是查询的 WHERE 部分。

据我所知,metaphone 仅适用于英语。上面的 sql 在许多站点上运行良好。

于 2011-06-03T13:56:39.017 回答