Nach ein paar Tests habe ich festgestellt, dass meine Suchmethode nicht sehr gut funktioniert, wenn einige Wörter der Abfrage kurz ist (2 ~ 3 Buchstaben).Optimierung der Suchfunktion MySQL oder PHP weise
Die Art, wie ich die Suche gemacht habe, besteht darin, eine MySQL-Abfrage für jedes Wort in der vom Besucher eingegebenen Zeichenfolge durchzuführen und dann das Ergebnis jedes Wortes zu filtern, um zu sehen, ob jedes Wort das Ergebnis hat. Sobald ein Ergebnis für alle Wörter zurückgegeben wurde, wird ein Treffer angezeigt und das Ergebnis wird dem Besucher angezeigt.
Aber ich fragte mich, ob das ein effektiver Weg ist, es zu tun. Gibt es einen besseren Weg bei gleicher Funktionalität?
Derzeit dauert der Code, den ich über .7Sec mache MySQL-Abfragen. Und der Rest ist unter .1Sec. Normalerweise würde ich mich nicht viel um meine Suche kümmern .7Sec, Aber ich mag es, eine "LiveSearch" zu erstellen und ist entscheidend, dass es schneller lädt als das.
Hier ist mein Code
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;
}
Recherchieren Sie über die Volltextsuche. Ihre Implementierung ist nicht möglich zu optimieren ('like' mit einem Operanden, der mit'% 'beginnt, würde immer einen vollständigen Tabellenscan ergeben). – zerkms
[Volltextsuche in Mysql] (http://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html) –
@zerkms Danke für Sie Kommentare Jungs, Nach dem Lesen erkannte ich, dass ich werde verliere die Funktionalität zu injizieren (für FreeShipping Zwecke) Habe ich Recht, das zu denken? Ich könnte es umgehen, indem Sie einfach die vollständige Suche und dann mit PHP entfernen Artikel, die nicht frei Versand (wenn Kunde suchte es).Aber gibt es einen besseren Weg mit Volltext, um Text basierend auf dem Zustand zu "injizieren"? –