なぜこれがどこにも見つからないのかわかりません。これはかなり一般的な要求だと思います。PHP で検索エンジンを作成して、ユーザーが入力したキーワードの販売リストの MySQL データベースを検索しています。
テーブルにはいくつかの列がありますが、検索する必要があるのは 2 つだけです。これらは、file_Title および file_Desc という名前です。クラシファイド広告のようなものと考えてください。アイテムのタイトルと説明。
たとえば、ユーザーは「John Deere Lawn Tractor」を検索します。私が実現したいのは、これら 4 つの単語すべてがリストの一番上に表示される広告です。次に、3つしかない結果など。
http://www.roscripts.com/PHP_search_engine-119.htmlの非常に優れた Web ページを読みました。
その著者の例から、私は以下のコードを持っています:
<?php
$search = 'John Deere Lawn Tractors';
$keywords = split(' ', $search);
$sql = "SELECT DISTINCT COUNT(*) As relevance, id, file_Title, file_Desc FROM Listings WHERE (";
foreach ($keywords as $keyword) {
echo 'Keyword is ' . $keyword . '<br />';
$sql .= "(file_Title LIKE '%$keyword%' OR file_Desc LIKE '%$keyword%') OR ";
}
$sql=substr($sql,0,(strLen($sql)-3));//this will eat the last OR
$sql .= ") GROUP BY id ORDER BY relevance DESC";
echo 'SQL is ' . $sql;
$query = mysql_query($sql) or die(mysql_error());
$Count = mysql_num_rows($query);
if($Count != 0) {
echo '<br />' . $Count . ' RESULTS FOUND';
while ($row_sql = mysql_fetch_assoc($query)) {//echo out the results
echo '<h3>'.$row_sql['file_Title'].'</h3><br /><p>'.$row_sql['file_Desc'].'</p>';
}
} else {
echo "No results to display";
}
?>
出力される SQL 文字列は次のとおりです。
SELECT DISTINCT COUNT(*) As relevance, id, file_Title, file_Desc FROM Listings
WHERE ((file_Title LIKE '%John%'
OR file_Desc LIKE '%John%')
OR (file_Title LIKE '%Deere%'
OR file_Desc LIKE '%Deere%')
OR (file_Title LIKE '%Lawn%'
OR file_Desc LIKE '%Lawn%')
OR (file_Title LIKE '%Tractors%'
OR file_Desc LIKE '%Tractors%') )
GROUP BY id
ORDER BY relevance DESC
このコードを使用すると、DB から 275 件の結果が得られます。私の問題は、行で見つかったキーワードの数で実際に並べ替えられないことです。代わりにIDで結果を並べ替えるようです。「GROUP BY id」を削除すると、すべての結果ではなく 1 つの結果のみが返されます。これは本当に面倒です!
また、データベースでFULLTEXTに移行しようとしましたが、それもうまくいかないように見えるので、LIKE %Keyword%
構文に固執したいと思います。
どんな助けでも大歓迎です!ありがとう!