运行一些测试后,我意识到如果查询的某些单词很短(2~3个字母),我的搜索方法效果不佳。
我进行搜索的方式是对访问者输入的字符串中的每个单词进行MySQL查询,然后从每个单词中过滤结果,看看每个单词是否都有该结果。一旦为所有单词返回一个结果,它就会匹配并向结果显示结果。
但我想知道这是否是一种有效的方法。在保持相同功能的同时还有更好的方法吗?
目前,我已经采用了.7Sec进行MySQL查询的代码。剩下的东西都在.1Sec之下。 通常我不会太在意我的搜索.7Sec,但我喜欢创建一个" LiveSearch"而且加载速度要快得多。
这是我的代码
public static function Search($Query){
$Querys = explode(' ',$Query);
foreach($Querys as $Query)
{
$MatchingRow = \Database\dbCon::$dbCon -> prepare("
SELECT
`Id`
FROM
`product_products` as pp
WHERE
CONCAT(
`Id`,
' ',
(SELECT `Name` FROM `product_brands` WHERE `Id` = pp.BrandId),
' ',
`ModelNumber`,
' ',
`Title`,
IF(`isFreeShipping` = 1 OR `isFreeShippingOnOrder` = 1, ' FreeShipping', '')
)
LIKE :Title;
");
$MatchingRow -> bindValue(':Title','%'.$Query.'%');
try{
$MatchingRow -> execute();
foreach($MatchingRow -> fetchAll(\PDO::FETCH_ASSOC) as $QueryInfo)
$Matchings[$Query][$QueryInfo['Id']] = $QueryInfo['Id'];
}catch(\PDOException $e){
echo 'Error MySQL: '.$e->getMessage();
}
}
$TmpMatch = $Matchings;
$Matches = array_shift(array_values($TmpMatch));
foreach($TmpMatch as $Query)
{
$Matches = array_intersect($Matches,$Query);
}
foreach($Matches as $Match){
$Products[] = new Product($Match);
}
return $Products;
}
答案 0 :(得分:0)
正如其他人已经建议的那样,fulltext search是你的朋友。
逻辑应该或多或少地像这样。
MATCH
构造查询表格,这可以通过使用您当前的方法获得更快的速度。