【问题标题】:search autocomplete performance with many records搜索具有许多记录的自动完成性能
【发布时间】:2014-05-28 16:44:39
【问题描述】:

我正在开发一个本质上是搜索栏的应用程序。源是一个包含大约 300,000 条记录的 SQL 表。

理想情况下,我希望在此搜索栏上附加某种自动完成功能。我一直在研究像 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
       });
});

【问题讨论】:

    标签: javascript jquery jquery-ui search autocomplete


    【解决方案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);
            }
        });
    

    【讨论】:

      【解决方案2】:

      您不应该在第一次 keyup 时开始查询 db,(即使是三到四个)keyup。 例如,用户正在输入信天翁。当他点击“A”时,如果您进行 Query 搜索,它会立即向您发送近 300,000 个结果,因为每组数据都必须有字母“A”。

      因此,应该忽略前几个 (3-5) 个字母。如果能存储搜索关键字就更好了。缓存排名靠前的结果,当 1-3 keyup 显示排名靠前的搜索关键字时。自动完成可能不是在这么大的数据库中搜索的好功能,

      问题的最后提示,您的用户每天都使用 google 和 facebook。对于上述任何应用程序中的每个搜索,它们都有超过 300,000 个结果。 Google 或 facebook 不会立即显示 1000 个结果。它不利于 UI 设计或您的服务器带宽。试想一下,您如何对数据进行分类并将其呈现给用户,以便他们得到他们想要的东西,并保持服务器带宽和处理成本最佳。

      永远记住上下文。

      【讨论】:

        【解决方案3】:

        不要自己绑定任何事件。 jQuery Autocomplete 已经执行了绑定。

        实现这一点的正确方法是将 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);
                }
            });
        }
        

        【讨论】:

          【解决方案4】:

          我假设您已经向表中添加了索引,如果不是这将是您的第一步,那么如果性能不足并且您的查询经常重复,您可能想看看这个。 http://memcached.org/ 或其他一些缓存机制。

          在请求某个键时,您将返回该键并将其添加到缓存中,随后对相同键数据的请求将从缓存中读取,而不是访问数据库。这将减少负载并提高速度。

          【讨论】:

            猜你喜欢
            • 2012-08-05
            • 1970-01-01
            • 2023-01-20
            • 1970-01-01
            • 2019-06-26
            • 2021-03-31
            • 2015-08-27
            • 1970-01-01
            • 2014-10-14
            相关资源
            最近更新 更多