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