2013-02-05 34 views
1

最近我一直在想的是,像imdb或github这样的站点如何在搜索栏中输入如此快速的搜索建议。我发现大多数jQuery插件会将数据集转储到页面上,然后在那里播放。但这不适用于大量的数据库,因为它会使页面重量巨大。我的第一个想法可能是同步ajax调用,但我被告知这可能会导致冻结,直到执行完成。如何从大型数据集中进行搜索建议

问题:如何在输入表单的同时从大型数据集中拉出记录,然后显示结果。

+0

总是它是AJAX。如果不是的话,我很乐于听到这个消息。 – samayo

+0

良好的索引+缓存 –

+0

研究jQuery的自动完成 - 它有一个源代码方法,它将aJax调用传递给服务器。其他人也存在。祝你好运。 – sgeddes

回答

2

我最近建立这样的一个常见问题,你面对的2个最大的问题是如下:

  • 数据库读取的时间,花费的时间在你的数据库上运行自己的搜索查询量
  • 您的通话时间,如果某人在一秒钟内输入了3个字符,那么您在一秒钟内完成3个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秒),当时间用完它的搜索并设置数据,但是如果在那秒有另一个有效的击键,它清除计时器并重置它。

希望这会有所帮助。

0

我个人非常喜欢Dojo如何解决'数据存储'问题。也就是说大多数解决方案都可能以jQuery UI的auto complete为中心。正如所建议的解决方案取决于AJAX请求回到匹配的服务器。这是力学的基础。通常你需要一些缓存方案,这样当用户输入一个或两个退格符时,你可以重新使用之前检索到的结果。现在就速度而言,取决于您搜索的数据集的大小,您可能需要一种索引搜索方法。 Lucene浮现在脑海。或者是一个mongoDB解决方案,将数据构建为针对搜索优化的内容。

1

下面是我的想法,它可以完成。

我会记录以前的用户搜索,并使用某种树结构来即时记录当人们开始输入同样的东西时人们最终输入的内容。那么你只需要在字典中查找,速度似乎不是问题。当然,你需要大量的存储容量,但我认为这对大公司来说不是问题。