Tra*_*vis 19 php mysql lucene full-text-search sphinx
我在mysql数据库中有大约2000行.
每行最多300个字符,包含一两句话.
我使用mysql内置的全文搜索来搜索这些行.
我想添加一个功能,以便在可能的情况下纠正拼写错误和意外错误拼写.
例如,如果有人在搜索框中输入"right shlder",则在执行搜索时这将等同于"右肩".
您对添加此类功能的最简单方法有何建议?是否值得添加某种外部搜索引擎,如lucene?(对于如此小的数据集来说,这似乎有点过分了.)或者是否有更简单的方法?
在此先感谢您的帮助.
Kev*_*ton 10
我认为你应该使用SOUNDS LIKE或SOUNDEX()
由于您的数据集非常小,一种解决方案可能是创建一个新表来存储每个文本字段中包含的单个单词或soundex值,并在该表上使用SOUNDS LIKE.
例如:
SELECT * FROM table where id IN
(
SELECT refid FROM tableofwords
WHERE column SOUNDS LIKE 'right' OR column SOUNDS LIKE 'shlder'
)
Run Code Online (Sandbox Code Playgroud)
请参阅:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html
我相信它是不可能通配卡搜索字符串:(
您正在寻找的技术术语是Levenshtein距离,用于计算两个序列之间的差异(在这种情况下是一个字符串序列,它是一个字符串).
PHP实际上有两个内置函数,第一个是similar_text,另一个叫levenshtein,可以帮助你解决问题.如果它足够快以满足您的需求,您将需要进行基准测试.
小智 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).'\')';
Run Code Online (Sandbox Code Playgroud)
然后进行全文搜索:
$query2 = 'SELECT * FROM table
WHERE MATCH(fultextcolumn)
AGAINST ('.join (' OR ', $resuls).' IN BINARY MODE)';
Run Code Online (Sandbox Code Playgroud)
其中$ result是包含第一个查询结果的数组.