php - Metaphone vs Levenshtein vs Soundex vs Hamming

标签 php mysql sql fuzzy-search

<分区>

我想使用 php 7 和 MySQL 5.7 实现一个模糊搜索。我在 Google 中进行了一些搜索,发现这些算法用于此目的:Metaphone、Levenshtein、Soundex 和 Hamming。

我想在我的表格中搜索歌曲标题。因此,用户可以使用标题、艺术家姓名或两者都进行搜索拼写错误,例如 YouTube for ex。

用于此目的的最佳算法是什么以及如何在 php/MySQL 中实现

最佳答案

SOUNDEX() 是 20 世纪初的一种简单算法,旨在帮助查找美式英语中的专有名词。它是为 Bell System 目录服务运算符(operator)构建的。它旨在产生大量误报,人类可以从中选择可能的命中。它可能不适合您的目的,因为您的话大多不是专有名词。

变音位和双变音位是对 SOUNDEX 的改进。他们研究更多种类的词。

这些方法最好逐字逐句,而不是像歌曲名称这样的短语。如果您实现这些中的任何一个,您将需要实现逐字匹配和某种评分方案。好消息是这些适用于索引,并根据单词的发音工作。

Levenshtein 距离适用于单词或短语,适用于拼写而不是声音。它不适合索引搜索,因为这些距离成对工作。根据我的经验,对 Levenshtein 距离进行评分是很棘手的,因为与其他长短语相比,较长的短语与其他长短语的区别方式比短短语多得多。

在尝试使用这些原始算法构建模糊搜索之前,您可以尝试使用 MySQL FULLTEXT 搜索和 Sphinx。这两种技术都可以很好地处理短语评分和停用词。 Sphinx 还支持同义词表,这有助于处理常见的拼写错误。

关于php - Metaphone vs Levenshtein vs Soundex vs Hamming,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37378158/

相关文章:

mysql - 将查询结果分配给 MySQL 变量

php - PDO 是否在所有 SELECT WHERE 查询中都需要参数?

php - 如何使用 symfony 1.4 修改生产数据库的结构

mysql - group by 是否需要 select 指令上的聚合函数?

mysql - MySQL 使用什么数据类型来存储图像?

sql - ActiveRecord: "WHERE IN"SQL 语句

php - mysql得到第4、5、6、7个结果

php - 当查询返回0条记录时更改MySQL比较值

python - 尝试使用 Connector/Python 时出现错误 "Access denied for user ' root' @'localhost"

sql - 由于 case 语句,同一 ID 的多个实例填充在不同的列中