自动完成服务器端实现
在 html 输入框中实现自动完成功能的服务器端组件的快速有效方法是什么?
我正在编写一个服务,用于在Web界面的主搜索框中自动完成用户查询,并且完成显示在ajax驱动的下拉列表中。我们运行查询的数据只是一个大型的概念表,我们的系统知道它,它与维基百科页面标题集大致匹配。对于这项服务,速度显然至关重要,因为网页的响应能力对用户体验很重要。
当前的实现只是将所有概念加载到排序集的内存中,并在用户击键时执行简单的log(n)查找。然后,尾集用于提供最接近匹配项之外的其他匹配项。此解决方案的问题在于它无法扩展。它目前运行在VM堆空间限制(我已经设置了-Xmx2g,这大约是我们可以在32位机器上推送的最多),这阻止了我们扩展概念表或添加更多功能。在具有更多内存的计算机上切换到 64 位 VM 不是立即选择。
我一直犹豫是否要开始开发基于磁盘的解决方案,因为我担心磁盘寻道时间会扼杀性能。有没有可能的解决方案可以让我更好地扩展,无论是完全在内存中还是通过一些快速的磁盘支持的实现?
编辑:
@Gandalf:对于我们的用例,重要的是自动完成是全面的,而不仅仅是对用户的额外帮助。至于我们正在完成的内容,它是概念类型对的列表。例如,可能的条目是[(“Microsoft”,“Software Company”),(“Jeff Atwood”,“Programmer”),(“StackOverflow.com”,“Website”)]。一旦用户从自动完成列表中选择一个项目,我们将使用Lucene进行完整搜索,但我不确定Lucene是否适用于自动完成本身。
@Glen:此处未使用任何数据库。当我谈论表时,我只是指数据的结构化表示。
@Jason日:我对这个问题的原始实现是使用Trie,但是由于需要大量的对象引用,因此内存膨胀实际上比排序集更糟糕。我将阅读三元搜索树,看看它是否有用。