2011-06-16 49 views
1

我有一个图(它是一个图形,因为一个节点可能有许多父母),有包含以下数据节点的图:算法搜索表示相关的特定关键字

  • 关键字ID
  • 关键字标签
  • 透水搜索数
  • 深度关键词推广

的相关性我的s从1开始评分。
子节点的相关性是由父节点与子节点的距离减去关键字的提升深度决定的。
来自同一深度的子节点的显示顺序由先前搜索的次数决定。
有没有一种算法能够搜索这样的数据结构?
如果我需要遍历所有节点,缓存生成的结果并通过页面显示它们,我是否有效率问题?考虑到这对于大量用户来说应该很好地扩展。如果我确实有问题,这怎么解决?
需要使用哪种数据库? NoSQL,关系数据库还是图形数据库?
该计划如何看起来像?
这可以使用django-haystack来完成吗?

+0

什么是您的搜索输入和输出? – dfb 2011-06-16 22:02:27

+0

@spinning_plate:输入是一组关键字(最初一个关键字是足够的,但由于开发必须支持多个关键字),输出是与该关键字相关的值列表。 – 2011-06-16 22:16:27

回答

3

看来你试图计算一个图上的top-k查询。有很多适合解决这个问题的算法,我相信最简单的算法将帮助你解决你的问题,即当在BFS中完成对图的遍历时,Threshold Algorithm (TA)。一些其他top-k算法是Lawler-Murty Procedure,并存在其他TA变体。

关于效率 - 计算查询本身可能有一个指数时间,只是由于要返回结果的指数数量,但使用时TA输出结果之间的时间应该是比较短的问题。至于缓存&涉及的规模,通常的考虑适用 - 您可能会想要使用分布式系统时,规模和适当的TA版本(如Threshold Join Algorithm)。当然,在选择使用哪种数据库解决方案时,您还需要考虑扩展性问题的缓存问题&。

就数据库而言,您绝对应该使用支持图形作为一等公民(那些通常被称为Graph Databases)的图形,并且我相信图形数据库后面的存储引擎是相对的并不重要或NoSQL。需要注意的一点是,您可能会希望确保您选择的数据库能够按照您所需的规模进行扩展(因此,对于大规模,也许您需要考虑更多分布式解决方案)。该模式将取决于您将选择的数据库(假设它不会是无模式数据库)。

最后但并非最不重要 - 干草堆。由于草垛将一切工作,搜索引擎,你选择使用将,应该有至少一个可能的方式工作,做到这一点(数据库结合Apache Solr搜索和Neo4jGoldenOrb),也许更多的(我” m不是很熟悉Haystack或者它支持的搜索引擎,而不是Solr)。

+0

第一个链接需要用户名和密码 – 2011-06-18 11:48:11

+0

糟糕。忘记我在一个内部大学网络。我已经修复了现在的链接。 – Drag0nR3b0rn 2011-06-18 17:50:51