在html输入框中实现服务器端组件的自动完成功能的快速高效的方法是什么?自动完成服务器端实现
我正在我们的Web界面的主搜索框中写一个自动完成用户查询的服务,并且完成显示在ajax-powered下拉菜单中。我们正在运行查询的数据只是一个我们系统知道的大概念表,它大致与维基百科页面标题集相匹配。对于这项服务,显然速度是最重要的,因为网页的响应对用户体验很重要。
当前实现只是将所有概念加载到有序集合的内存中,并对用户按键执行简单的log(n)查找。然后用尾部组合提供超出最接近匹配的附加匹配。这个解决方案的问题是它不能缩放。它目前正在满足VM堆空间限制(我已经设置了-Xmx2g,这是我们可以在32位机器上推动的最多的),并且这妨碍了我们扩展概念表或增加更多功能。切换到具有更多内存的计算机上的64位虚拟机不是直接选项。
我一直在犹豫是否开始使用基于磁盘的解决方案,因为我担心磁盘寻道时间会导致性能下降。有没有可能的解决方案可以让我更好地扩展,无论是内存还是一些快速的磁盘备份实现?
编辑:
@Gandalf:对于我们的使用情况下,重要的是自动完成的是全面的,是不是用户只需额外的帮助。至于我们正在完成的内容,它是一个概念类型对的列表。例如,可能的条目是[(“Microsoft”,“Software Company”),(“Jeff Atwood”,“Programmer”),(“StackOverflow.com”,“Website”)]。一旦用户从自动完成列表中选择一个项目,我们正在使用Lucene进行全面搜索,但我还不确定Lucene对于自动完成本身是否适用。
@Glen:这里没有使用数据库。当我谈论一张桌子时,我只是指我的数据的结构化表示。
@Jason Day:我对这个问题的原始实现是使用Trie,但由于需要大量的对象引用,因此内存膨胀实际上比有序集合更差。我会阅读三元搜索树,看它是否可以使用。
你能告诉我们一点关于你是什么“自动完成”维基。为什么这么多条款?是否有更明显的会满足用户查询的90%,而不是加载所有可能性? – Gandalf 2009-06-09 16:29:38
我无法确定Lucene是否适合您的需求,但是在这个尺寸的数据集上,我非常怀疑您不会在优化的Lucene索引上获得亚秒查询时间。根据索引设置的方式,您甚至可以将其存储在内存中。 – Gandalf 2009-06-09 20:58:08
一个标准的Trie确实是非常强大的内存,对于更大的集合,你想使用一个压缩的Trie,这大大减少了内存占用。其他优化包括节点值的延迟初始化和子/值集合的正确数据结构。前一段时间,我创建了一个[Java自动完成库](https://github.com/fmmfonseca/completely),能够处理非常大的数据集(10,000,000+),并有效地回答精确和近似的搜索。 – 2015-06-23 14:36:32