2011-12-20 208 views
0

假設我有5個文檔作爲行和2列'文檔'和'描述'在mySQL表中。關鍵字搜索和排名結果

  • 資料1:約翰和南希是最好的朋友。
  • 資料2:約翰,凱西,大衛,南希是最好的朋友。
  • 文檔3:Nancy和Casey是最好的朋友。
  • 文件4:David與Casey有關係。大衛和凱西瘋狂地戀愛。
  • 文件5:大衛和約翰是兄弟姐妹。

因此,如果搜索查詢是「David Casey」,那麼如何根據所有5個文檔中的詞頻計算查詢並根據頻率對結果進行排名。

在這種情況下,結果應該是這樣的:

  • 文獻4(因爲有2 '大衛' 和2 '凱西')
  • 文獻2(1 '大衛' 和1 '凱西')
  • 文獻3(1'凱西)
  • 文件5(1 '大衛')

我讀過許多TF-IDF的文章,但沒有人能幫助我。我不知道如何編寫代碼。

這是我當前的代碼:

$ searchCondition = 「描述LIKE「%」。 implode(「%」或描述LIKE'%「,$ searchTerms)。 「%'」;

$ query =「SELECT description FROM table1 WHERE $ searchCondition ORDER BY description ASC」;

$ result = mysqli_query($ dbc,$ query);

...

...

...

+0

歡迎來到SO!另外,您的代碼包含您應該修復的[SQL注入](http://php.net/manual/en/security.database.sql-injection.php)漏洞。 – 2011-12-20 10:35:09

+0

你有沒有看過MySQL的全文搜索功能http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html – liquorvicar 2011-12-20 10:43:42

+0

已經有了,但我仍然沒有想法。 :/ – Fhzwn 2011-12-20 10:50:24

回答

0

這工作肯定:

$searchCondition = "description LIKE '%" . implode("%' OR description LIKE '%", $searchTerms) . "%'"; 
$orderCondition = array(); 
foreach ($searchTerms as $word) { 
    $orderCondition[] = "(length(description)-length(replace(description,\"".$word."\",\"\")))/length(\"".$word."\")"; 
} 
$orderConditionString = "(".implode(" + ", $orderCondition).")"; 

$query = "SELECT description FROM table1 WHERE $searchCondition ORDER BY $orderConditionString DESC"; 

從數據庫中的項目進行排序,然後按降序。所以最相關的是獲得第一名。

注意:只有當關鍵字的數量很小時才能正常工作。由於每個關鍵字的長度檢查了3次。所以對更大的表格和更多關鍵字的響應時間會有點不同;)

+1

謝謝@AndVla,編碼正在工作!但是,結果沒有按照我在第一篇文章中提到的那樣排列。你有什麼主意嗎? – Fhzwn 2011-12-20 11:47:20

+0

您想要在結果查詢中獲取數據庫中每行的等級? – AndVla 2011-12-20 11:54:03

+1

是的,當我在你的php中實現你的代碼時,結果是2,4,5,3。根據我的查詢,結果應該是4,2,3,5:「David Casey」。我想知道如何處理這個問題。 – Fhzwn 2011-12-20 12:01:23