MySQL全文搜索 - 数值和ft_min_word_len的解决方法

时间:2011-03-10 14:23:29

标签: php mysql search full-text-search

我正在使用MySQL全文搜索IN BOOLEAN MODE,但由于my.cnf中ft_min_word_len设置所施加的字符限制限制(目前设置为3在这个服务器上)。是否有任何解决方法,以便像“东西14”这样的搜索将搜索“某事物”和“14”(或甚至“十四”),因为当前字符限制意味着忽略3位数以下的数字。由于搜索字符串中的数字片段很重要,我们需要将ft_min_word减少为1,以确保所有搜索都返回正确的结果,这会使索引速度极慢。一个潜在的解决方案是使用PHP替换数字和它们的等效单词,并确保该单词也被添加到可搜索的文本中,但这会让人感到烦恼。

还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

是的,我多年前遇到过这个问题,并且一直在为我的客户使用这个解决方案。在结果方面,它使事情运作良好。

基本上它的作用是将3个字符以下的任何内容分成LIKE搜索,将3个字符以外的任何内容分成全文布尔搜索。我目前正在发布我的分层搜索版本。但直到我完成。我发布了它的全文部分,以便您可以使用该代码。如果您有任何问题或使其更好。我只是要求你将它发布在我的Project Hosted网站上,以便它变得更好。

完整功能显示在源链接上。

$parseQuery = explode(" ",$query);
foreach($parseQuery as $key => $qvalue)
{
        if(strlen($qvalue) > 3)
        {
                $buildQuery .= "$qvalue ";
        }
        elseif(strlen($qvalue) >= 2)
        {
                $buildLike[] = "`blog` LIKE '%$qvalue%'";
        }
}

if($buildLike != "")
{
$numCountQuery = 0;
        $countforbuilding = count($buildLike) - 1;
        foreach($buildLike as $key => $queryforLike)
        {
                if($numCountQuery != $countforbuilding)
                {
                        $finalBuildLike .= "$queryforLike AND";
                }
                else
                {
                        $finalBuildLike .= "$queryforLike";
                }
                $numCountQuery++;
        }
} 
if(($finalBuildLike != "") && ($buildQuery != ""))
{
$finalBuildLike = "AND $finalBuildLike";
}

if($buildQuery != "")
{
$buildDescription = $buildQuery;
$buildQuery = "MATCH(blog) AGAINST ('".trim($buildQuery)."')";
}

http://code.google.com/p/php-mysql-layered-search/

希望这有帮助。