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/

相关文章:

php - 如何在 Laravel 中使用具有多态关系的 "group by"?

sql - 将两列相乘并在新列 PostgreSQL 中显示结果

mysql - 在 SELECT Case 语句中组合行

php - 如何通过 PhpStorm 在 Vagrant 实例上运行应用程序?

php - 将 Google OAuth API 与现有用户系统集成?

php - Laravel 5 加入同一张表

php - 如何从MySql中删除重复用户但保存原始用户

MYSQL 更新具有重复值但最早日期的行

mysql - 带过滤的电子邮件处理

sql - VB.net 中的 Datatable.Select 和 Like