1

在我网站的高级搜索屏幕中,大约有 15 个字段需要自动完成字段。
它们的内容都取决于彼此的值(因此如果填写一个,则另一个的内容将根据第一个的值而变化)。
大多数字段都有大量的可能性(至少有 1000 个条目)。

如果用户停止输入半秒钟,则当前进行 ajax 调用。这个 ajax 调用快速调用我的 Lucene 索引并返回一堆 JSon 对象。方法本身确实很快,但是数据的连接和传输太慢了。

如果我查看其他网站(比如 facebook),它们的自动完成功能是即时的。我认为他们将可能的值放在 HTML 中,因此他们不必进行往返。但我担心我正在处理的数据量很大,这不是一个选择。

有任何想法吗?

4

6 回答 6

5
  1. 仅返回前 x 个结果。
  2. 获取一些关于用户选择的趋势,并根据这些趋势进行订购,最好是自动订购。
  3. 缓存每个 URL 和击键组合的结果,这样如果您之前已经获取过结果,就不必往返。
  4. 与使用相同 URL 和击键组合的所有自动完成共享此缓存。
  5. 当然,为 JSON 启用 gzip 压缩,并确保将缓存标头设置为缓存一段时间。时间取决于您自动完成响应的变化率。
  6. 优化 JSON 以发送最低限度。不要发送任何你不需要的东西。
于 2009-03-09T09:12:51.367 回答
4

您是返回所有结果的可能性还是只返回前 10 个作为 json 对象。

我注意到很多人将大量结果发送回屏幕,但只显示前几个。通过发回少量结果,您可以减少数据传输。

于 2009-03-09T08:45:54.770 回答
2

返回顶部的“X”结果,而不是整个列表,以减少选项的数量?您可能还想尝试添加一些趋势来跟踪用户从列表中选择的内容,以便您可以尝试使顶部的“X”成为最常用/最相关的。您总是可以先返回您最相关的列表,然后如果他们仍在苦苦挣扎,则返回完整列表。

于 2009-03-09T08:54:35.293 回答
2

除了将结果集限制为顶部 X 集之外,还可以考虑对 AJAX 请求的响应启用缓存(这意味着使用 GET 并保持 URL 简单)。

令人惊讶的是,用户经常退格然后最终重新输入完​​全相同的内容。此外,通过允许公共和服务器端缓存,您可以加快整体往返时间。

于 2009-03-09T09:09:52.947 回答
1
于 2009-03-09T09:16:46.440 回答
0

返回前 N 个条目是一个好方法。但是,如果您想要/必须返回所有数据,我会尝试限制正在发送的数据和 JSON 对象本身。

例如:

“This Here Company With a Long Name”变为“This Here Company...”(您将点放在客户端名称中——再次;传输最少的数据)。

就 JSON 对象而言:

{n: "This Here Company", v: "1"}

...其中“n”是名称,“v”是值。

于 2009-03-09T09:09:55.227 回答