MySQL中的ft_min_word_len
设置为4.当我尝试使用2或3个字母进行全文搜索时,我得不到任何结果。因此,我使用此代码对这些简短的字词进行全文搜索:
$table = $this->db->shop_products();
$where = '';
preg_match_all("~[\\pL\\pN_]+('[\\pL\\pN_]+)*~u", stripslashes($find), $matches);
foreach($matches[0] as $part) {
$isFirst = empty($where);
$regexp = "REGEXP '" . addslashes($part) . "'";
if(!$isFirst) $where .= " AND (";
$where .= "name {$regexp} OR content {$regexp}";
if(!$isFirst) $where .= ")";
}
return $table->where($where)->limit(5)->fetchAll();
此代码工作正常,但它有变音问题,如č, á, é, í...
。例如,我有一个名为bé
的产品,当我想找到be
时,它不会向我显示该产品,因为它没有相同的字母。
注意:我使用NotORM进行MySQL查询,但我希望您知道$table->where(...
的工作原理。
答案 0 :(得分:0)
所以我找到了解决方案,但使用的是PHP,而不是MySQL。正好在foreach
我把这行$part = diagriticToNormal($part);
- 所以它会将特殊字符更改为经典字符,或者如何命名。在这个答案下有这个功能。我知道这是蹩脚的,对性能不好......但作为一个开始它是应该的。
function diagriticToNormal($text) {
$charsMap = array(
'a' => array('á', 'ä'),
'c' => array('č'),
'd' => array('ď'),
'e' => array('é', 'ě'),
'i' => array('í'),
'l' => array('ľ', 'ĺ'),
'n' => array('ň'),
'o' => array('ô', 'ó'),
'r' => array('ŕ', 'ř'),
's' => array('š'),
't' => array('ť'),
'u' => array('ú', 'ů'),
'y' => array('ý'),
'z' => array('ž'),
);
foreach($charsMap as $real => $alt) {
$alt = implode('|', $alt);
$text = str_replace(array(strtolower($real), strtoupper($real)), '[' . $real . '|' . $alt . ']', $text);
}
return $text;
}