2010-08-27 62 views
0

PHP/MySQL後端。我有一個充滿電影YouTube風格的數據庫。每個視頻都有一個名稱和類別。視頻和類別具有m:n的關係。稱重搜索結果

我希望我的訪問者能夠搜索視頻並讓他們在一個搜索字段中輸入搜索詞。我無法弄清楚如何根據類別,名稱中的事件返回最佳搜索結果。

什麼是最好的方式去這樣的事情?評分? =>檢查每個搜索詞是否出現在視頻名稱中;如果是的話,授予視頻一分;檢查視頻是否在包含在搜索查詢中的類別中;如果是的話,給它一個點。按收到的號碼分類嗎?這聽起來在CPU使用率方面非常昂貴。

回答

1

首先,使用全文搜索。它可以是MySql全文搜索或某種外文全文搜索引擎。我建議sphinx。它非常快速,簡單,甚至可以使用SphinxSE與MuSQL集成(所以搜索索引看起來像MySQL中的loke表)。但是,您必須安裝並配置它。

其次,考慮按搜索類型拆分搜索結果。任何類型的全文搜索都會返回按相關性排序的匹配項列表。您可以搜索所有字段並獲取單個列表。這是個不好的主意,因爲按名稱命中和按類別命中將是混合的。要解決這個問題,您可以進行多項搜索 - 首先按名稱搜索,然後按類別搜索。

因此,你將有兩個匹配的集合,你有很多選擇如何顯示這個。一些想法:

  1. 根據搜索引擎返回的相關度合併2套。這看起來像是單個查詢的結果,但是您知道每個項目是什麼(名稱命中或類別命中),因此您可以突出顯示這個
  2. 執行與上述相同的marge,但爲不同的集指定不同的權重,對於eaxmple相關性= 0.7 * name_relevancy + 0.3 * category_relevancy。這會使搜索結果更加自然
  3. 將結果吐入標籤/組例如'有N個標題和M類別與您的查詢匹配)
  4. 顯示結果時使用頻段。對於每個頁面(假設您正在使用paginator分割搜索結果)從第一個集合中拆分N個項目,從第二個集合中拆分M個項目(您可以逐個沉浸於逐個集合或隨機播放項目)。如果在套一個沒有足夠的項目則只是得到另一組更多的項目,所以總有M + N項目每頁
  5. 任何其他方式,你可以想像

而且你可以使用這個方法對於任何類型的領域 - 名稱,分類,演員,導演等。但是,越多的領域,你使用更多的搜索查詢,你必須執行

+0

真棒,正是我一直在尋找。感謝並歡迎SO – 2011-02-20 11:01:09

1

我不認爲你可以避免爲每個搜索查看每部電影的標題和類別。因此,CPU的使用率是給定的。如果您擔心排序的CPU使用率,那麼在大多數情況下它可以忽略不計,因爲您只會排序具有多於零點的項目。

話雖如此,你可能想要的是一個部分基於規則和部分基於點的系統。例如,如果您的標題與搜索字詞相同,則無論點數如何,它都應該排在第一位。構建您的搜索,以便您可以輕鬆添加規則和調整點,只要您認爲合適就能產生最佳結果。

編輯:如果確切標題匹配,您可以利用數據庫索引而不是搜索整個表格。或者,類別也是一樣。