我正在开发一个基本上是搜索栏的应用程序。源是一个SQL表,有大约300,000条记录。
理想情况下,我希望在此搜索栏中附加某种自动填充功能。我一直在研究像jquery autocomplete这样的几个。
但是,可以想象,将所有这些记录加载为自动完成的源是不可能的。表现会很糟糕。
所以我的问题是,为包含成千上万条记录的来源实施搜索自动完成功能的有效方法是什么?
我想到了这样的事情。基本上我每次输入内容时都会查询数据库以获得结果列表。但是,通过ajax查询数据库并不是最佳选择。$( "#search" ).keyup(function( event ) {
$.ajax({
//query the database when the user begins typing, get first 1000 records
//set the source of the autocomplete control to the returned result set
});
});
答案 0 :(得分:2)
不要自己绑定任何事件。 jQuery自动完成已经执行绑定。
实现此目的的正确方法是将source:
对象设置为AJAX回调:
source: function (request, response) {
$.ajax({
url: 'yourQueryUrl.php', // <- this script/URL should limit the number of records returned
async: true,
cache: false,
type: 'GET',
data: {q: $('#searchBox').val()},
dataType: 'json',
success: function (data) {
response(data);
}
});
}
答案 1 :(得分:2)
你不应该在第一个keyup(甚至不是3-4个)keyup中开始查询db。 例如,用户正在输入Albatross。当他点击“A”时,如果你进行查询搜索,它会立即向你发送近300,000个结果,因为每组数据必须有字母“A”。
所以,应该忽略前几(3-5)个字母。如果您可以存储搜索关键字,那就更好了。缓存顶部结果,当1-3键提示时,您会显示热门搜索关键字。自动完成可能不是在大型数据库中搜索的好功能,
问题的最后提示,您的用户每天都使用谷歌和Facebook。在上述任何应用程序中,每次搜索的结果都超过300,000。谷歌或Facebook不会一次显示1000个结果。它不适合UI设计或您的服务器带宽。试想一下,您如何对用户进行分类和呈现数据,以便他们得到他们想要的东西,并使您的服务器带宽和处理成本保持最佳。
总是记住上下文。
答案 2 :(得分:1)
我假设你已经为你的表添加了索引,如果没有这将是你的第一步,那么如果性能不足并且你的查询经常重复,你可能想看看这个。 http://memcached.org/ 或其他一些缓存机制。
根据某些密钥的请求,您将返回该密钥并将其添加到缓存中,opon后续请求相同的密钥数据将从缓存中读取而不是访问数据库。这样可以减少负载并提高速度。
答案 3 :(得分:1)
source: function (request, response) {
$.ajax({
url: 'yourQueryUrl.php', // <- this script/URL should limit the number of records returned
async: true,
cache: false,
type: 'GET',
data: {q: $('#searchBox').val()},
dataType: 'json',
success: function (data) {
response(data);
}
});