検索エンジンのような MySQL 最適化検索に適した MATCH-AGAINST を使用します。全文検索を表示する必要があります: http://dev.mysql.com/doc/refman/5.5/en//fulltext-search.html
注: MySQL テーブルでは、データベースのテーブル内のキーワード行の FULLTEXT として INDEX する必要があります。これにより、検索のパフォーマンスが向上します。
例:
入力キーワードの例:
$keywords = '+Word+Word2+Word3';
SELECT p.page_url AS url,
COUNT(*) AS occurrences, MATCH('w.word_word') AGAINST ('$keywords') as keyword FROM page p, occurrence o, w.word WHERE MATCH
('w.word_word') AGAINST('{$keywords}' IN
BOOLEAN MODE)
AND p.page_id = o.page_id AND w.word_id = o.word_id
GROUP BY p.page_id
ORDER BY occurrences DESC
LIMIT $results
他の最適化されていないモードで、またはクエリが最適化されていない場合 (グループが多すぎて、句と条件が多すぎる)、サーバーのパフォーマンスが低下する危険性があります。これの代わりに、たとえば MySQL で REGULAR EXPRESSION を使用できます。
REGEXP "/(honda)|(jazz)|(manual)/"
これにより、正規表現を使用したパフォーマンスも向上します (巨大なデータベースにはお勧めしません)。
ループを作成し、REGEXP に入れるよりもカウントします。
$keywords = "keyword1,keyword2,keyword3";
$expl = explode("," $keywords);
if (count($expl) == 1)
{
$all = w.word_word REGEXP = '[[:<:]]$keywords[[:>:]]';
}
else
{
$all = '';
foreach ($expl as $keyone)
{
$all .= 'OR '.w.word_word REGEXP = '[[:<:]]$keyone[[:>:]]';
}
}
$sql = 'SELECT p.page_url AS url,
COUNT(*) AS occurrences
FROM page p, word w, occurrence o
WHERE p.page_id = o.page_id AND
w.word_id = o.word_id AND
$all
GROUP BY p.page_id
ORDER BY occurrences DESC
LIMIT $results';
$result_query = mysql_query($sql);