我最近一直在思考的事情是,当我在搜索栏中键入内容时,imdb 或 github 等网站如何提供如此快速的搜索建议。我发现大多数 jQuery 插件都会将数据集转储到页面上,然后在那里使用它。但这不适用于大型数据库集,因为它会使页面权重变得巨大。我的第一个想法可能是同步 ajax 调用,但有人告诉我这可能会导致冻结,直到执行完成。
问题:如何在输入表单时从大型数据集中提取类似记录,然后显示结果。
我最近一直在思考的事情是,当我在搜索栏中键入内容时,imdb 或 github 等网站如何提供如此快速的搜索建议。我发现大多数 jQuery 插件都会将数据集转储到页面上,然后在那里使用它。但这不适用于大型数据库集,因为它会使页面权重变得巨大。我的第一个想法可能是同步 ajax 调用,但有人告诉我这可能会导致冻结,直到执行完成。
问题:如何在输入表单时从大型数据集中提取类似记录,然后显示结果。
我最近为常见问题解答构建了类似的内容,您面临的两个最大问题如下:
如果这是一个非常基本的搜索,那么第一个问题并不是什么大问题,您可以在几毫秒内轻松查询一个小表,但是当搜索大量文本时它会变慢。最好的方法是使用像 Sphinx 或 Solr 这样的搜索引擎。他们为您的数据库中的数据编制索引,以便进行快速和相关的查找。
第二个是通过感知来解决的,当用户击键之间的间隔不到一秒(这取决于您的听众的计算机知识)时,您不会进行查找。这意味着只有当他们稍微暂停时才会进行查找。这意味着更少的查询和更少的系统压力。下面的例子:
var typingTimer;
var doneTypingInterval = 1000;
$('.huge-input').stop().keyup(function(e){
if ((e.which <= 90 && e.which >= 48) || e.which == 8){
var myHugeInput = $(this);
clearTimeout(typingTimer);
typingTimer = setTimeout(
function(){
//Do the look up and set data
},
doneTypingInterval
);
}
});
所以在这里我们检查一个输入框是否有一个有效的键输入,我们清除计时器,然后设置一个 1000 毫秒(1 秒)的超时时间,当时间用完时,它会搜索并设置数据,但如果有在那一秒钟内的另一个有效击键将清除计时器并重置它。
希望这可以帮助。
这就是我想象的可以做到的方式。
我会记录用户之前的搜索,并使用某种树结构来即时记录人们在开始输入与您相同的内容时最终输入的内容。然后你只需要在字典中查找,速度似乎不是什么大问题。当然,你需要大量的存储容量,但我想这对大公司来说不是问题。
我个人非常喜欢 Dojo 处理“数据存储”的方式。也就是说,大多数解决方案可能都围绕 jQuery UI 的自动完成。正如建议的那样,解决方案依赖于 AJAX 请求返回到服务器进行匹配。这就是力学的基础。通常你会需要一些缓存方案,这样当用户输入一两个退格键时,你就可以重用之前已经检索到的结果。现在就速度而言,根据您正在搜索的数据集的大小,您可能需要一种索引搜索方法。想到了Lucene。或者一个 mongoDB 解决方案,其中您的数据被构建到优化搜索的东西中。