2012-10-16 55 views
0

我有一個搜索引擎,掃描給定網頁中的所有單詞,然後顯示它們的發生。然後按照單詞在文檔中出現的次數排名。但它不會返回多個術語查詢。多項查詢

以下是我的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"); 
+0

使用在MySQL ... – Dev

+0

確保你逃脫輸入也或使用PDO或類似的更安全的技術。一個searchphrase應該放在引號'\「$ keyword \」'中。 – jtheman

+0

是的,您可以在('word1','word2',...)中使用w.word_word。只是匹配wordcount並不是很精確,但如果你想保持簡單... –

回答

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陳述(由開發中的意見建議)和您的查詢就會變成:

$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); 

最後,請嘗試使用mysqli代替mysql,或PDO。

HTH

+0

相反,在我的解決方案中,我會給你一個投票(對begginers點好),好點,但性能應該低,如果不使用龐大的數據庫或太多的連接。,而不是這個,我傾向於使用匹配或很少regexp。好點子。 –

1

我將與MATCH-反對走這應該是更好地爲MySQL的優化,如搜索引擎的搜索。您應該查看全文搜索:http://dev.mysql.com/doc/refman/5.5/en//fulltext-search.html

注意:在MySQL表中,應將INDEX編輯爲數據庫表中關鍵字行的FULLTEXT。 這會爲搜索提供更高的性能。

實施例:

輸入關鍵字的實施例:

$關鍵字= '+字+字2 + 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 

在其他逆優化的模式或有風險的,如果你的查詢是不opitmized降低性能的服務器(太多組,其中的條款和條件)。取而代之的是,你可以使用正則表達式在MySQL例如:

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); 
+0

你每天都會學到東西:) –

+0

是的!謝謝! –