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

2022-08-30 20:01:02

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

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

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

我想添加一个功能,以便如果可能的话,可以纠正拼写错误和意外拼写错误。

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

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


答案 1

我认为你应该使用或SOUNDS LIKESOUNDEX()

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

例如:

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

我相信不可能用外卡搜索字符串:(


答案 2

MySQL不支持全文SOUNDEX搜索。

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

当有人搜索“right 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是包含第一个查询结果的数组。


推荐