いくつかのテストを実行した後、クエリの一部の単語が短い場合(2〜3文字)、検索メソッドがうまく機能しないことに気づきました。検索機能の最適化MySQLまたはPHPの賢明
私が検索を行ったのは、訪問者が入力した文字列のすべての単語に対してMySQLクエリを作成し、各単語の結果をフィルタリングして各単語にその結果があるかどうかを確認することです。すべての単語に対して1つの結果が返されると、一致とilはその結果を訪問者に示します。
しかし、それが効果的な方法であるかどうかは分かりませんでした。同じ機能を維持しながら、より良い方法はありますか?
現在、私が持っているコードは、.7SecがMySQLクエリを作成するのに要します。残りのものは0.1秒未満です。 通常、私は7Secを取って検索することについてはあまり気にしませんが、Idは「LiveSearch」を作成するのが好きで、それより速く読み込むことが重要です。
はここfulltext searchはあなたの友人である、私のコード
他の人が既に提案してきたように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;
}
フルテキスト検索の調査を行います。あなたの実装は最適化することはできません( '%'で始まるオペランドで 'like 'は常に完全なテーブルスキャンの場合です)。 – zerkms
[mysqlの全文検索](http://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html) –
@zerkmsコメントありがとうございます、読者の後で、私は(FreeShippingのpurpusesのために)注射するfunctionallityを緩めるそれを考えることは正しいですか? 私は単純に完全な検索を行い、その後、無料の配送ではない(顧客がそれを検索した場合)PHPのアイテムを削除することで回避することができます。しかし、条件に基づいてテキストを「注入」するフルテキストでは、より良い方法がありますか? –