在MySQL全文搜索中处理拼写错误的最佳方法

时间:2011-08-26 06:42:10

标签: php mysql lucene full-text-search sphinx

我在mysql数据库中有大约2000行。

每行最多300个字符,包含一两句话。

我使用mysql内置的全文搜索来搜索这些行。

我想添加一项功能,以便在可能的情况下纠正拼写错误和意外错误拼写。

例如,如果有人在搜索框中键入“right shlder”,则在执行搜索时这等同于“右肩”。

您对添加此类功能的最简单方法有何建议?是否值得添加某种外部搜索引擎,如lucene? (对于如此小的数据集来说,这似乎有点过分了。)或者有更简单的方法吗?

先谢谢你的帮助。

3 个答案:

答案 0 :(得分:10)

我认为您应该使用SOUNDS LIKESOUNDEX()

由于您的数据集非常小,一种解决方案可能是创建一个新表来存储每个文本字段中包含的单个单词或soundex值,并在该表上使用SOUNDS LIKE。

e.g:

SELECT * FROM table where id IN 
(
    SELECT refid FROM tableofwords 
    WHERE column SOUNDS LIKE 'right' OR column SOUNDS LIKE 'shlder'
)

请参阅:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

我相信它不可能通过外卡搜索字符串:(

答案 1 :(得分:8)

您正在寻找的技术术语是Levenshtein distance,它用于计算两个序列之间的差异(在这种情况下是一个字符串序列,是一个字符串)。

PHP实际上有两个内置函数,第一个是similar_text,另一个叫levenshtein,可以帮助你解决问题。如果它足够快以满足您的需求,您将不得不进行基准测试。

答案 2 :(得分:8)

MySQL不支持全文搜索SOUNDEX。

如果你想实现类似lucene的框架,那就意味着你必须获取所有文档,将它们分成单词,然后为每个单词构建一个索引。

当有人搜索“正确的shlder”时,您必须对世界桌中的每个单词进行SOUNDEX搜索:

    $search = 'right shlder';
preg_match_all('(\w+)', $search, $matches);
if (!empty($matches[0]))
   $sounds = array_map('soundex', $matches[0]);
$query = 'SELECT word FROM words_list
    WHERE SOUNDEX(word) IN(\''.join('\',\'',$sounds).'\')';

然后进行全文搜索:

$query2 = 'SELECT * FROM table
    WHERE MATCH(fultextcolumn)
    AGAINST ('.join (' OR ', $resuls).' IN BINARY MODE)';

其中$ result是包含第一个查询结果的数组。