我有一个图表(并且它是一个图表,因为一个节点可能有许多父节点),其中包含具有以下数据的节点:
相关性的评分从1开始
子节点的相关性取决于父节点与子节点的距离减去关键字促销的深度。
来自相同深度的子节点的显示顺序由前一次搜索的数量决定
有没有一种能够搜索这种数据结构的算法?
如果我需要横向所有节点,缓存生成的结果并按页面显示它们,考虑到这对于大量用户来说可以很好地扩展,我是否会遇到效率问题?如果我确实有问题,如何解决?
我需要使用什么类型的数据库? NoSQL,关系数据库或图形数据库?
该计划将如何?
可以使用django-haystack完成吗?
答案 0 :(得分:3)
您似乎正在尝试计算图表上的top-k查询。有各种各样的算法适合解决这个问题,我认为最简单的算法是帮助你解决问题的是Threshold Algorithm (TA),当图表的遍历以BFS方式完成时。其他一些top-k算法是Lawler-Murty Procedure,并且存在其他TA变体。
关于效率 - 计算查询本身的问题可能具有指数时间,这仅仅是由于要返回的指数结果,但是当使用TA时,输出结果之间的时间应该相对较短。就缓存而言涉及的规模,通常的考虑因素适用 - 您可能希望在规模获得和适当的TA版本(例如Threshold Join Algorithm)时使用分布式系统。当然你需要考虑缩放和放大选择使用哪种数据库解决方案时会出现缓存问题。
就数据库而言,你绝对应该使用一个支持图形作为一等公民(那些通常被称为Graph Databases),并且我认为如果图形背后的存储引擎无关紧要数据库是相对的还是NoSQL。需要注意的一点是,您可能希望确保您选择的数据库可以扩展到您需要的规模(因此,对于大规模,您可能希望查看更多分布式解决方案)。架构将取决于您将选择的数据库(假设它不是无架构数据库)。
最后但并非最不重要 - 干草堆。由于haystack将使用您选择使用的搜索引擎将使用的所有内容,因此至少应该有一种可能的方法(将Apache Solr与搜索结合起来Neo4j或GoldenOrb对于数据库而言,可能更多(因为我对Haystack或它支持的搜索引擎并不熟悉Solr)。