0

特定の Web ページ内のすべての単語をスキャンし、それらの出現を表示する検索エンジンがあります。次に、単語がドキュメントに出現する頻度によってランク付けされます。ただし、複数の用語クエリは返されません。

以下は私のSQLクエリです。入力されたすべての単語をチェックし、単語がドキュメントに表示される回数でランク付けできるようにしたいと思います。現時点では、単一用語クエリでのみ機能しています。

         $result = mysql_query(" 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
                       w.word_word = \"$keyword\"
                       GROUP BY p.page_id
                       ORDER BY occurrences DESC
                       LIMIT $results" );
4

2 に答える 2

1

すべての単語を取得したい場合、結合条件ではそれができません

w.word_word = \"$keyword\"

クエリは次のように記述できます

$sql = "SELECT p.page_url as url, COUNT(*) as occurences "
     . "FROM page p "
     . "INNER JOIN occurence o ON p.page_id = o.page_id "
     . "INNER JOIN word w ON w.word_id = o.word_id "
     . "GROUP BY p.page_id "
     . "ORDER BY occurences DESC "
     . "LIMIT {$results}";
$result = mysql_query($sql);

これにより、テーブル内のすべての単語が取得されるwordため、(私が理解しているように) 必要な結果が得られます。

いくつかの単語に興味がある場合は、INステートメントを使用できます(コメントでDevが提案したように)。クエリは次のようになります。

$my_keywords = array('apple', 'banana');
// This produces: "apple", "banana" and assumes that all of your 
// keywords are in lower case. If not, you can transform them to lower
// case or if you don't want that, remove the LOWER() function below 
// from the WHERE
$keywords    = '"' . implode('","', $my_keywords) . '"';
$sql = "SELECT p.page_url as url, COUNT(*) as occurences "
     . "FROM page p "
     . "INNER JOIN occurence o ON p.page_id = o.page_id "
     . "INNER JOIN word w ON w.word_id = o.word_id "
     . "WHERE LOWER(w.word_word) IN ({$keywords}) "
     . "GROUP BY p.page_id "
     . "ORDER BY occurences DESC "
     . "LIMIT {$results}";
$result = mysql_query($sql);

最後に、または PDOmysqliの代わりに使用してみてください。mysql

HTH

于 2012-10-16T20:30:29.867 に答える
1

検索エンジンのような 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);
于 2012-10-16T20:41:37.807 に答える