1

我正在为 django/python 站点构建搜索引擎。一个要求是 soundex 功能,因此如果有人搜索“smith”或“johnson”,搜索将返回“smyth”或“jonsen”等同音词。数据库是 MySQL,FWIW。

什么是推荐的好方法?现在我倾向于使用像 Haystack + Whoosh 这样的东西来捕捉 soundex 功能。

在此先感谢您的帮助。

4

1 回答 1

4

MySQL 有一个 soundex() 函数。文档在这里。但 soundex 算法最初是为了帮助搜索英语中的盎格鲁-撒克逊人名而开发的。如今,这可能不是最好的选择。

使用 metaphone 或double metaphone可能会更好。

无论如何,大多数人都会存储结果。这使得索引很容易,并且搜索通常非常快。

但是,数据完整性是一个问题。理想情况下,我想做这样的事情。

create table persons (
  ...
  last_name varchar(25) not null,
  last_name_phonetic varchar(6) not null,  -- Not sure about the length
  check (last_name_phonetic = double_metaphone(last_name))
  ...
);

但这要求您的 dbms 具有内在的 double_metaphone() 函数,或支持 CHECK() 约束中的用户定义函数。MySQL 根本不强制执行 CHECK() 约束,因此如果您的应用程序需要这种数据完整性,则需要在触发器中实现这一点。

值得一提的是,PostgreSQL 有一个 contrib 模块,fuzzystrmatch,它实现了 soundex、metaphone、double metaphone 和 Levenshtein 距离函数。如果由我决定,我会在 PostgreSQL 而不是 MySQL 中构建它。

于 2014-02-05T23:21:58.650 回答