2012-02-15 31 views
3

現狀尋找更快的算法來計算的文檔數據庫標籤/關鍵詞/標籤動態tagcloud

  • .NET 4.0應用程序(WPF)
  • 數據庫:SQLCE
  • 表(簡體):文檔,標籤,文檔標籤[n:n]
  • 大致2000個文檔和600個標籤(標籤可以分配給多個文檔)
  • tags = keywords = labels

案例

用戶有一個大的數據庫文件,這是他可以用標籤雲過濾。標籤顯示一個名稱(標籤名稱本身)和一個數字,它是具有相應標籤的文檔的總數。 如果用戶選擇一個標籤,則只顯示具有所選標籤的文檔。動態標籤雲現在應該只顯示已更新計數編號的已過濾文檔上的可用標籤。

問題

它是緩慢的。在每個選定的標籤之後,我們需要再次評估所有文檔以對標籤進行計數。我們目前以遞歸方式進行,因此我們檢查每個文檔的標籤。我們正在尋找另一種解決方案(緩存,更好的算法,您的想法?)。

相似

計算器,del.icio.us也有標籤雲。看看你自己。他們是如何做到的呢?我知道存儲過程是一個解決方案,但根據我們的數據庫開發人員,這在SQLCE上不可用。

+0

我是否正確理解,緩慢部分顯示標籤**僅用於由一個標籤**選擇的文檔列表? – 2012-02-15 11:47:32

+0

實際上,顯示的文檔越少,速度越快,因爲每次列表過濾時都會收到標籤。現在,在應用程序開始時,所有2000個文檔都可用,我們的應用程序通過文檔獲取所有標籤文檔。 – Wolkenjaeger 2012-02-15 13:50:25

+0

我的答案在下面有幫助!無需循環文檔,您可以在一個查詢中執行此操作。 – 2012-02-15 16:03:49

回答

1

您可以使用兩個inverted indexes,其中每個標籤都將成爲兩者的關鍵。

一個倒排索引實際上是
一個map:Tags->list of Tags [即共同occure與鍵中的所有標籤]第二個將map:Tags->list of Docs [即共同occure與每個標籤的所有文件。

在選擇了一些標籤之後計算相關的文檔集只是倒排索引的交集,可以高效地完成。
此外,找到修改後的標籤雲也是倒排索引上的交集。

請注意,倒排索引可以脫機創建,並創建它是map-reduce用法的典型示例。

This thread討論如何在倒排索引,以有效地找到交集

+0

這似乎很有希望。我們必須研究這個解決方案,這需要一些時間。感謝您的貢獻! – Wolkenjaeger 2012-02-15 13:53:24

+0

@Wolkenjaeger:不客氣。我很高興能幫助你。 – amit 2012-02-15 14:48:44

0

你應該做在單個查詢您的第二階段搜索,像

SELECT 
    tags.id AS tagid, 
    tags.name AS tagname, 
    count(*) AS tagcount 
FROM 
    tags 
    INNER JOIN DocumentsTags AS tda on tda.tagid=tags.id 
    INNER JOIN DocumentsTags AS tdb on tda.documentid=tdb.documentid 
WHERE 
    tdb.tagid=<selected tag id> 
GROUP BY 
    tags.id 

編輯

後您的評論,這是你應該使用的第一階段曲ery(即:尚未選擇標籤,列表中的所有文檔)

SELECT 
    tags.id AS tagid, 
    tags.name AS tagname, 
    count(*) AS tagcount 
FROM 
    tags 
    INNER JOIN DocumentsTags AS tda on tda.tagid=tags.id 
GROUP BY 
    tags.id