2009-03-05 37 views
5

我正在尋找數據庫中不同記錄之間關鍵字匹配的最佳解決方案。這是一個經典問題,我找到了類似的問題,但沒有具體的問題。什麼是標籤/關鍵字匹配的最佳解決方案?

我已經完成了全文搜索,連接和子查詢,臨時表......所以我真的很想看看你們是如何解決這樣一個共同的問題。

所以,假設我有兩張桌子; ProductsKeywords,它們與經典的多對多關係中的第三個表Products_Keywords鏈接。

如果我在頁面上顯示一個Product的記錄,並且想顯示頂部n相關產品,那麼最好的選擇是什麼?

我們應該考慮到記錄可能會共享幾個關鍵字,並且這個事實應該決定頂級相關產品的排序。

我打開其他想法,但由於性能原因,T-SQL將是更可取的解決方案。

+0

Pedantry警報:某些東西不能'最優化'。它不是最優的,也被稱爲「最佳」,或者不是。 ;-) – nekomatic 2009-03-10 14:16:05

+0

我站在更正:) – muerte 2009-03-10 20:38:31

回答

0

嗯,也許是這樣的follwing:

select p.productId, p.name, r.rank 
from products p inner join (
/* this inner select should bring in only products that have at least one keyword 
=> shared with the requested product, and will count the actual number shared (for ranking)*/ 
    select related.productId, count(related.productId) as rank 
    from 
     products_keywords related inner join 
     products_keywords pk ON (pk.productId = @productId AND related.keywordId = pk.keywordId) 
    where related.productId <> @productId 
    group by related.productId 
) r on p.productId = r.productId 
order by r.rank DESC /* added DESC (not in orignal solution, but needed to put higher ranked on top)*/ 

現在我嚴重懷疑這是一個最佳的SQL語句,但它應該完成這項工作。我無法驗證它,因爲我只是從頭開始編寫它,沒有實際的支持表或要測試的數據。

+0

如果你想爲以上加權關鍵字,你選擇你的權重爲0> x> = 1之間的數字,你可以設置排名爲(count(related.productId)*(sum (pk.weight)/ SUM(峯作爲等級 或[C *(w/w + 1)=等級],其中C是計數並且w是總計權重。 – 2009-03-05 17:44:07

3

我的第一個鏡頭會是這樣的:

SELECT 
    P.product_id, 
    COUNT(*) 
FROM 
    Product_Keywords PK1 
INNER JOIN Product_Keywords PK2 ON 
    PK2.keyword_id = PK1.keyword_id 
INNER JOIN Products P ON 
    P.product_id = PK.product_id 
WHERE 
    PK1.product_id = @product_id 
GROUP BY 
    P.product_id 
ORDER BY 
    COUNT(*) DESC 

Product_Keywords的加盟Product_Keywords(PK2到PK1)可能是粗糙的,所以我不能表現說話。這是我開始的地方,然後看看優化。

作爲Assaf評論的後續行動,需要考慮的一件事是您可以爲Product_Keywords和SUM(PK1.weight)+ SUM(PK2.weight)添加一個「權重」以進行排名。只是一個想法。

編輯:詳細說明加權...你可能會決定你想讓關鍵字加權。雖然用於確定權重的實際方法將是一個商業決策,所以我不能真正給你太多的指導。

作爲一個例子,這個問題是關於「編程」,「關鍵字匹配」和「SQL」。編程是非常通用的,所以如果兩個問題有共同點,那麼它們可能並不意味着它們是相關的,所以也許你只是把它看作是1. SQL更具體一些,所以你可以將它們權重爲5.關鍵字匹配既是問題的主要焦點,也是非常具體的,所以你可以用一個10來加權。當然,這只是一個例子,正如我所說的那樣,權重的確切確定以及得分方式它取決於具體的業務。你可能會認爲匹配關鍵字的數量比權重更重要,所以也許權重只能用作決勝手等。HTH。

相關問題