【问题标题】:Autocomplete performance and private "magic search"自动完成性能和私人“魔术搜索”
【发布时间】:2014-10-14 09:29:30
【问题描述】:

自动完成字段的性能不佳会降低其实用性。如果客户端实现必须调用执行繁重的数据库查找的端点,响应时间很容易令人沮丧。

AWS Case Study: IMDb 提供了一种简洁的方法。它曾经带有一个图表(不再可用),但简而言之,将为每个可以以有意义的方式解析的组合生成并存储一个预测树。例如。 sta 的分辨率将包括 Star Wars, Star Trek, Sylvester Stallone 将被存储,但 stb 不会解析为任何有意义的东西,也不会被存储。

为了获得尽可能低的延迟,所有可能的结果都是 为每个字母组合预先计算一个文档 搜索。每个文档都被推送到 Amazon Simple Storage Service (Amazon S3),从而到 Amazon CloudFront,将文件 物理上靠近用户。可能的理论数量 要计算的搜索令人难以置信——20 个字符的搜索有 23 x 1030 种组合——但在实践中,使用 IMDb 在电影和 名人数据可以将搜索空间减少到大约 150,000 个文档, Amazon S3 和 Amazon CloudFront 可以在几个 小时。 IMDb 以多种语言创建索引并每日更新 用于包含超过 100,000 个电影和电视节目以及名人姓名的数据集。

如何使用私有数据实现类似的性能体验?例如。自动完成客户名称、工作 ID、发票编号...为不同的用户存储不同的文档/决策树听起来很昂贵,尤其是如果某些数据(客户名称?)可以供多个用户使用。

【问题讨论】:

    标签: javascript search architecture autocomplete client-side


    【解决方案1】:

    你说得对,这样的工作负载需要一些特殊的优化。

    您可以使用现成的搜索引擎,例如 Apache luceneSolr(这是 lucene 的 REST API 包装器)

    该引擎针对全文搜索进行了优化,可以处理私人数据。

    工作步骤:

    1. 安装 solr(或 lucene)
    2. 设计用于存储信息的架构(您需要哪些字段和搜索类型)
    3. 将数据加载到其中(通过 bach 操作或基于更新)
    4. 基于 solrs 查询语言的查询搜索(类似于 google 搜索)。 在这个地方,除了原始用户查询之外,您还可以添加基于 user_id 或任何 over 参数的特殊限制。因此,私人数据不会在用户之间造成混乱。

    【讨论】:

      【解决方案2】:

      我实际上同意 CGI。最好的解决方案是第三方搜索引擎。其他任何东西都在尝试建立自己的搜索引擎。我真的不确定你的帖子可以使用什么硬件,所以如果你得到的只是 LAMP 托管,我会为你提供一个可能的解决方案。

      因此,在您的 PHP 代码中,您将创建一个查询字符串,例如:

      $qstr = "SELECT * FROM Clients WHERE `name` like '%".$search."%' ORDER BY popularity DESC LIMIT 0,100";
      

      增加通过“搜索引擎”找到的每条记录的流行度列。 在前端(假设您使用 Dojo),您可以执行类似...

      <script>
         require(["dojo/on", "dojo/dom", "dojo/request/xhr", "dojo/domReady!"], function (on, dom, xhr) {
             on(dom.byId('txtSearch'), "change", function(evt) {
                 if (typeof searchCheck !== undefined) clearTimeout(searchCheck);
                 searchCheck = setTimeout(function() { //keep from flooding XHR
                     xhr("fetch-json-results.php", {
                        handleAs: "json"
                     }).then(function(data){
                        //update txtSearch combo store
                     });
                 }, 500);
             });
         });
      </script>
      <input id="txtSearch" type="text" data-dojo-type="dijit/form/ComboBox" data-dojo-props="intermediateChanges:true">
      

      这将是一个低技术低预算 (LAMP) 等效答案。

      【讨论】:

      • 我所说的“为找到的每条记录增加流行度列”的意思是当用户从搜索结果列表中选择该项目时。
      • 我被分散了头脑......也只是将您的结果推送到组合框的数据存储中,不要替换现有结果。让小部件完成其余的缩小范围。您还想调整超时和返回的结果数。我只是即兴写了这个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2015-08-18
      • 2014-05-28
      相关资源
      最近更新 更多