使用带有django搜索引擎的soundex功能

时间:2014-02-05 23:05:54

标签: python mysql django soundex

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

什么是推荐的好方法?现在我倾向于像Haystack + Whoosh这样的东西,有一些东西可以捕捉soundex特征。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

MySQL有一个soundex()函数。 Docs are here。但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,双metaphone和Levenshtein距离函数。如果由我决定,我会在PostgreSQL而不是MySQL中构建它。