正在寻找一种更快的算法来为动态标签云计算文档数据库上的标签/关键字/标签
本文关键字:标签 寻找 动态 云计算 文档数据库 关键字 算法 一种 | 更新日期: 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