2

ユーザーが MySQL データベースを使用してコンテンツを作成、投稿、および表示できる PHP ベースのシステムを開発しています。各コンテンツはテーブル行に格納されます。ユーザーがコンテンツを投稿すると、PHP スクリプトが一般的な単語またはタグを抽出し (「and」や「or」などのストップ ワードを削除)、出現順に並べ替え、データベース内の配列としてすべて保存します。

各コンテンツと生成されたタグを表示するだけでなく、表示されているコンテンツに 1 つ以上のタグが付けられた類似の投稿コンテンツ (YouTube の関連動画または関連ストーリーに似ている) のリストを表示する機能が欲しいニュースサイト)。さらに、各コンテンツのタグの数に基づいてリストを並べ替えたいと思います。

私はいくつかの調査を行い、タグが存在するかどうかに基づいてデータベース内から行を選択できる 2 つの異なるスクリプトを開発しました。ただし、どちらのスクリプトにも問題があります。

最初に試したのは LIKE クエリでした。

$tags=$row['tags'];
$tags2=explode(",",$tags);
foreach ($tags2 as $key => $keyword) {
    $sql = ("SELECT DISTINCT * FROM table WHERE tags LIKE '%$keyword%' ");
    if ($key != (sizeof($tags2)-1)){ 
        $sql .= " OR "; 
    }
    $sql .= " LIMIT 20";
}

このクエリの問題は、結果が順序付けされていないことです。次に、MATCH AGAINST クエリを試しました。

$tags=$row['tags'];
$tags2=explode(",",$tags);
$searchstring="";
foreach ($tags2 as $word){
    $searchstring = $searchstring .' +'.$word;
}
$sql = ("SELECT * FROM table WHERE MATCH (tags) AGAINST ('$searchstring' IN BOOLEAN MODE)");

結果は関連性によって並べ替えられますが、すべてのタグが存在する行のみが取得され、その行にタグが 1 つでも欠けている場合、その行はクエリによって取得されません。

私が望むのは、両方の機能の長所を組み合わせ、1 つ以上のタグを含む行を選択し、存在するタグの数に基づいてそれらを並べ替えることです。例えば; 行 1 に 10 個のタグが含まれ、行 2 に 20 個のタグがあり、行 1 に 9 個のタグが見つかり、行 3 に 50 個のタグがあり、行 1 に 8 個のタグが見つかった場合、行 2 と行 3 の両方が取得され、行 2 は行 3 より関連性が高くなります。

どんな助けでもいただければ幸いです

4

1 に答える 1

2

+に文字を含めると、$searchstringすべてのタグが強制的に存在するようになります。単語だけを入力して を省略した+場合、エンジンは各単語の存在を必要とせずに結果をランク付けします。

MySQL での全文検索のドキュメントをご覧ください。

各単語には多くのオプションがあります。+結果のどこかに単語が見つかるように-強制し、結果のどこにも単語が見つからないように強制し、単語が見つかること~を許可しますが、見つかった場合は結果のランキングを下げます。ドキュメントを読んでください。非常に便利です。

于 2012-01-09T19:45:30.610 に答える