自动填充字段的性能不佳会降低其实用性。如果客户端实现必须调用执行大量数据库查找的端点,则响应时间很容易令人沮丧。
一种巧妙的方法来自AWS Case Study: IMDb。它曾经带有一个图表(不再可用),但简而言之,将为每个可以以有意义的方式解决的组合生成和存储预测树。例如。 sta
的分辨率将包括将存储的Star Wars, Star Trek, Sylvester Stallone
,但stb
将无法解析为任何有意义且无法存储的内容。
为了获得尽可能低的延迟,所有可能的结果都是 用文件预先计算每个字母组合 搜索。每个文档都被推送到Amazon Simple Storage Service (亚马逊S3)并由此向Amazon CloudFront投放文件 物理上靠近用户。理论上可能的数量 搜索计算是令人难以置信的 - 一个20个字符的搜索有23 x 1030种组合 - 但在实践中,使用IMDb对电影和电影的权威 名人数据可以将搜索空间减少到大约150,000个文档, 其中Amazon S3和Amazon CloudFront可以分发几个 小时。 IMDb使用每日更新以多种语言创建索引 对于超过100,000个电影和电视节目以及名人姓名的数据集。
如何通过私人数据实现同样高效的体验?例如。自动完成客户端名称,工作ID,发票号码......为不同的用户存储不同的文档/决策树听起来很昂贵,特别是如果某些数据(客户端名称?)可供多个用户使用。
答案 0 :(得分:1)
你说这样的工作量需要一些特殊的优化。
您可以使用现成的搜索引擎,例如Apache lucene或Solr(用于lucene的REST API包装器)
此引擎针对全文搜索进行了优化,可以使用私有数据。
工作步骤:
答案 1 :(得分:0)
我实际上同意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)等效答案。