在分布式系统中为特快输入建议存储特里树的最佳方法是什么?

问题描述

我一直在阅读一些有关尝试的信息,以及它们如何成为快速输入设计的良好结构。除了特里树,通常还为节点提供键/值对,并预先计算了top-n建议以缩短响应时间。

通常,根据我的收集,理想的情况是将它们保留在内存中以进行快速搜索,例如在此问题中建议的内容Scrabble word finder: building a trie,storing a trie,using a trie?。但是,如果您的Trie太大而又不得不以某种方式将其分片怎么办? (例如,可能是大型电子商务网站)。

用于预先计算建议的键/值对可以明显地在键/值存储中实现(既可以存储在内存中,如memcached / redis,也可以存储在数据库中,并根据需要水平调用),但是最好的方法是特里存储在内存中的方法?应该完全做到这一点,还是应该将分布式系统的每个部分都保存在内存中,同时还要对其进行复制以免丢失?

或者,可以使用搜索服务(例如Solr或Elasticsearch)来生成搜索建议/自动完成功能,但是我不确定性能是否能满足此特定用例的要求。 Trie的优点是您可以根据其结构预先计算top-N建议,而让搜索服务来处理网站上的实际搜索

我知道有一些现成的解决方案,但是我最感兴趣的是学习如何重新发明这一方案,或者如果有人想知道的话,至少可以瞥见最佳实践这个主题

您有什么想法?

编辑:我还看到了这篇文章https://medium.com/@prefixyteam/how-we-built-prefixy-a-scalable-prefix-search-service-for-powering-autocomplete-c20f98e2eff1,其中基本上涵盖了将Redis用作跳过列表的主要数据存储,其中mongodb用作LRU前缀。看起来不错,但是我仍然想了解是否还有其他可行/更好的方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...