Database design 用于标记、云计算和搜索的最佳数据体系结构(如StackOverflow)?

Database design 用于标记、云计算和搜索的最佳数据体系结构(如StackOverflow)?,database-design,tags,full-text-search,tag-cloud,Database Design,Tags,Full Text Search,Tag Cloud,我很想知道Stack Overflow的标记和搜索是如何构建的,因为它似乎工作得很好 如果我想执行以下所有操作,那么什么是好的数据库/搜索模型: 在各种实体上存储标记(如何规范化?即实体、标记和实体\标记表?) 搜索具有特定标记的项目 构建应用于特定搜索结果集的所有标记的标记云 如何在搜索结果中显示每个项目的标记列表 也许以规范化的形式存储标记是有意义的,但出于#2、#4或#3的目的,也可以将标记作为空格分隔的字符串来存储。想法 我听说Stack Overflow使用Lucene进行搜索。这

我很想知道Stack Overflow的标记和搜索是如何构建的,因为它似乎工作得很好

如果我想执行以下所有操作,那么什么是好的数据库/搜索模型:

  • 在各种实体上存储标记(如何规范化?即实体、标记和实体\标记表?)
    • 搜索具有特定标记的项目
    • 构建应用于特定搜索结果集的所有标记的标记云
    • 如何在搜索结果中显示每个项目的标记列表
  • 也许以规范化的形式存储标记是有意义的,但出于#2、#4或#3的目的,也可以将标记作为空格分隔的字符串来存储。想法


    我听说Stack Overflow使用Lucene进行搜索。这是真的吗?我听过一些讨论SQL优化的播客,但对Lucene一无所知。如果他们确实使用Lucene,我想知道有多少搜索结果来自Lucene,以及“深入”标记云是否来自Lucene。

    我不知道它们是否符合最佳条件,但DotNetKicks和Kigg都是开源digg克隆实现。你可以看看他们是如何做标签和搜索的

    我最好的猜测没有经过深思熟虑:)

  • 我从不喜欢将多个值序列化到单个字段中的想法,因此存储在一个字段中的分隔字符串对我没有吸引力。。。可能适用于具有树的邻接路径,但这些路径总是有序的,不需要标记。这似乎会像你为找到它们所做的操作一样征税

  • 因此,我最初的想法可能是Entity->EntityTag哇,我刚刚写了一篇大文章,然后就被憋住了。当我点击后退按钮重新提交时,标记编辑器是空的。啊

    所以我又来了

    关于堆栈溢出,事实证明它们使用了

    关于@Grant推荐的操作系统项目:

    • *DotNetKicks使用DB进行标记,使用Lucene进行全文搜索。似乎无法将全文搜索与标记搜索结合起来
    • Kigg在搜索和标记查询中使用Linq到SQL。两个查询都连接故事->故事标签->标签
    • 这两个项目都有一个3表的方法来标记,这似乎是每个人都推荐的
    我还发现了一些我以前错过的其他问题:

    我目前正在为我提到的每个项目做什么:

  • 在数据库中,有3个表:实体、标记、实体标记。我使用DB来:
    • 构建站点范围的标记云
    • 按标记浏览(如SO/questions/tagged/ASP.NET等URL)
  • 对于搜索,我使用Lucene+NHibernate.search
    • 标记被合并成一个由Lucene索引的标记字符串
      • 因此,我拥有Lucene查询引擎的全部功能(和/或/或不查询)
      • 我可以同时搜索文本和按标签过滤
      • Lucene analyzer合并单词以更好地进行标记搜索(即,标记搜索“test”也会找到标记为“testing”的内容)
    • Lucene返回一个潜在的巨大结果集,我将其分页为20个结果
    • 然后NHibernate根据Id从DB或实体缓存加载结果实体
    • 因此,完全有可能搜索结果在数据库中点击0次
  • 目前还没有这样做,但我想我可能会尝试从Lucene中的标记字符串中找到一种构建标记云的方法,而不是再次使用DB
  • 我也没有这样做,但我可能会将标记字符串存储在DB中,这样我就可以显示实体的标记列表,而不必再进行两次连接
  • 这意味着每当修改实体的标记时,我必须:

    • 插入任何不存在的新标记
    • 从EntityTag表中插入/删除
    • 更新Entity.TagString
    • 更新实体的Lucene索引
    考虑到我的应用程序中的读写比非常大,我认为我可以接受这一点。唯一真正耗时的部分是Lucene索引,因为Lucene只能从其索引中插入和删除,所以我必须重新索引整个实体以更新标记字符串。我对此并不感到兴奋,但我认为如果我在后台线程中这样做,就可以了


    时间会告诉我们……

    这个答案中的第一个链接(“SQL server 2005全文搜索”)似乎不再有效了?更新后的链接可能是:很好的回顾,Winston,thx,以跟进您的方法。