正在寻找一种更快的算法来为动态标签云计算文档数据库上的标签/关键字/标签

本文关键字:标签 寻找 动态 云计算 文档数据库 关键字 算法 一种 | 更新日期: 2023-09-27 18:24:35

当前状态

  • .NET 4.0应用程序(WPF)
  • 数据库:SQLCE
  • 表格(简化):文档,标记,文档标记[n:n]
  • 大约2000个文档和600个标签(标签可以分配给多个文档)
  • tags=关键字=标签

案例

用户有一个大的文档数据库,他可以使用标签云对其进行过滤。标记显示一个名称(标记名称本身)和一个数字,该数字是具有相应标记的文档的总数。如果用户选择了标记,则只显示具有所选标记的文档。动态标记云现在应该只显示具有更新计数的过滤文档上的可用标记。

问题

它很慢。在每个选定的标记之后,我们需要再次评估所有文档以计数标记。我们目前是递归的,所以我们在每个文档上检查它有什么标签。我们正在寻找另一种解决方案(缓存,更好的算法,你的想法?)。

相似性

stackoverflow,del.icio.us也有标签云。看看自己。他们是怎么做到的?我知道存储过程是一个解决方案,但根据我们的数据库开发人员的说法,这在SQLCE上是不可用的。

正在寻找一种更快的算法来为动态标签云计算文档数据库上的标签/关键字/标签

您可以使用两个反向索引,其中每个标记都是这两个索引中的一个键。

一个反向索引实际上是一个map:Tags->list of Tags[与键同时出现的所有标记]
第二个将是map:Tags->list of Docs(与每个标签同时出现的所有文档)。

在选择了一些标签后计算相关的文档集只是反向索引上的交集,这可以有效地完成。
同样,找到修改后的标记云也是反向索引上的交集。

请注意,反向索引可以离线创建,创建它是map reduce使用的经典示例。

本线程讨论如何有效地在反向索引

中找到交集

您应该在单个查询中执行第二阶段搜索,类似

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

编辑

在您的评论之后,这是您应该用于第一阶段查询的内容(即:尚未选择标记,列表中的所有文档)

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