2012-01-09 22 views
2

我正在開發一個基於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理解

+0

這聽起來像「爲我做我的工作」,而不是像一個可以讓他人受益的問題。 – 2012-01-09 19:33:40

+0

@Assaf:我可能是這麼說的。我不希望任何人爲我做這項工作。此外,我喜歡編碼的挑戰。如何解決這個問題的建議更接近我所期待的。 – siberiantiger 2012-01-09 19:46:24

+0

@Assaf我不同意。他做了研究。他提出了一些解決方案,並解釋了爲什麼他們不工作。他表示指出正確的方向就足夠了。所有這些對我來說聽起來都很合理。 – ean5533 2012-01-09 19:46:37

回答

2

+字符列入是什麼迫使所有標籤存在。如果只輸入單詞並省略+,引擎將排列其結果而不需要每個單詞出現。請參閱docs for fulltext searching in MySQL

每個單詞都有很多選項。 +將強制在搜索結果的某個位置找到單詞,-將強制在搜索結果的任何位置找不到單詞,~將允許找到單詞,但如果找到該單詞,則會降低搜索結果的排名。閱讀文檔,它們非常有用。

+0

當你說忽略+字符,你的意思是替換($ searchstring = $ searchstring。'+'。$ word;)with($ searchstring = $ searchstring。$ word;),只有我剛剛嘗試過這種方法,並且仍然遇到與以前相同的問題,唯一顯示的結果是包含所有標記的行,而不是其中的一個或多個。儘管感謝您的幫助。 – siberiantiger 2012-01-09 19:52:08

+0

這就是我的意思,是的,雖然你應該確保你仍然在每個單詞之間添加空格。但通常,MATCH(col)AGAINST('word1,word2,word3')將返回包含任何word1,word2,word3的行。如果你沒有看到這種行爲,你能發表一個正在執行的查詢的例子嗎? – ean5533 2012-01-09 19:55:27

+0

忘記我最後的評論。我誤解了你的答案。現在它工作得好多了。非常感謝。 – siberiantiger 2012-01-09 19:55:31

相關問題