经过几次测试后,我意识到如果查询的某些单词很短(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;
}
正如其他人已经建议的那样,全文搜索是您的朋友。
逻辑应该或多或少像这样。
MATCH
构造查询表,这是使用当前方法可以更快地获得的方式。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句