通过相关性搜索mySQL(模糊,同义词)

时间:2012-03-29 10:33:54

标签: php mysql search dictionary

我正在创建一个小型语言词典应用程序,要求用户输入一个单词(使用两种语言)并显示最相关的结果(满分10个或更多)。我的客户希望这能解释拼写错误,所以我使用的是Damerau-Levenshtein距离公式。作为一个例子,这里有一个应用程序应该做的代码片段:

MySQL fields - Term1 -> Value1 | Term2 -> Value2
Implementation - English Term -> English Value | German Term -> German Value
----------

forge -> to forge your parent's signature | fälschen -> die unterschrift de eltern fälschen
    Synonyms: fake, imitation, etc,
fake -> to fake your parent's signature | fälschen -> die unterschrift de eltern fälschen
    Synonyms: forge, imitation, etc,
black out -> to black out a classroom (with blinds) | verdunkeln -> (einen klassenraum) verdunkeln

由于假和伪造相似,我希望伪造(或foreg等)的搜索结果返回两者。我现在有一个粗略的实现工作,它将搜索大型数据库的每一行,但这是一个漫长的过程,我需要一个更好的系统。

作为附加信息,我使用Moby叙词表来查找返回的每个单词的同义词。为了减少批量同义词(因为在数组中放置了近20个结果),我可能会删除数据库中找不到的条目。

无论如何,我想要找出的是,如果有一种比我现在使用的更快,更有效的搜索数据库的方法。我希望我很清楚,如果不能随意问我更多。

非常感谢!

1 个答案:

答案 0 :(得分:1)

Damerau-Levenshtein距离是一种无法通过预先计算的索引进行优化的算法。因此,在DBMS上下文中使它更快时,您将遇到一些麻烦。 (有一些技巧可以将单个单词与词汇组织的单词进行比较,但它们非常具有异国情调。)

但是,如果您可以检索同义词表的内容的子集,那么使用距离算法,您可能会赢。

第一步尝试在mySQL中内置的SOUNDEX(一种草率且非常便宜的声音匹配算法)。或者,如果网络投射过宽,您可能会查找Metaphone或Double Metaphone算法。

然后第二步做你正在用距离算法做的事情。

查看此问题和几个答案。 How do I do a fuzzy match of company names in MYSQL with PHP for auto-complete?