我正在開發一個基於PHP的系統,用戶可以使用MySQL數據庫創建,發佈和查看內容片段,每條內容都存儲在表格行中。當用戶發佈內容時,PHP腳本會提取常用單詞或標籤(刪除像'and'和'or'之類的任何停用詞),按出現順序排列它們,並將它們全部作爲數組存儲在數據庫中。使用PHP和MySQL創建基於標記的相關鏈接功能
除了查看每條內容和生成的標籤,我還希望能夠顯示一系列類似內容的發佈內容,這些內容包含一個或多個顯示內容的標籤(類似於YouTube的相關視頻或新聞網站上的相關故事)。此外,我希望根據每個內容有多少個標籤來排列列表。
我已經做了一些研究,並且我開發了兩種不同的腳本,可以根據是否存在任何標籤來從數據庫中選擇行。但是,這兩個腳本都有問題;
我試過的第一個是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)");
雖然結果按相關性排序,只檢索行的所有標籤都存在,如果該行甚至缺乏一個標籤,它不是由查詢檢索。
我想要的是將兩個功能中最好的一個組合起來,選擇包含一個或多個標籤的行,然後根據存在多少個標籤對它們進行排序。例如;如果row1包含10個標籤,則row2包含20個標籤,其中9個在row1中找到,row3包含50個標籤,8個在row1中找到,那麼row2和row3都將被檢索到,其中row2與row3更相關。
任何幫助將在您的$searchstring
理解
這聽起來像「爲我做我的工作」,而不是像一個可以讓他人受益的問題。 – 2012-01-09 19:33:40
@Assaf:我可能是這麼說的。我不希望任何人爲我做這項工作。此外,我喜歡編碼的挑戰。如何解決這個問題的建議更接近我所期待的。 – siberiantiger 2012-01-09 19:46:24
@Assaf我不同意。他做了研究。他提出了一些解決方案,並解釋了爲什麼他們不工作。他表示指出正確的方向就足夠了。所有這些對我來說聽起來都很合理。 – ean5533 2012-01-09 19:46:37