【问题标题】:implement instant threaded search algorithm实现即时线程搜索算法
【发布时间】:2011-05-15 18:02:40
【问题描述】:

所以我想知道实现负载密集型即时搜索的一般算法是什么。不是专门在网络上,而是在桌面/winforms 应用程序中。

如果我错了,请纠正我,但不能在每次击键时发送异步调用,对吗? (不确定how google instant manages this)它会在数据库/存储等上产生疯狂的负载。

我一直在想这样的事情:

  1. 每 xxx 毫秒触发一次计时器
  2. 着火、禁用输入、禁用计时器并发送异步调用以进行搜索。
  3. 当调用返回时,显示结果,启用输入,启用定时器

这是它通常的处理方式,还是有更好的方法?

【问题讨论】:

  • 我认为您应该只在该人停止输入一段时间后触发,而不是禁用输入。
  • 您不想在等待搜索返回时禁用输入 - 许多人的输入速度比您从服务器返回搜索结果的速度要快,这真的很烦人。
  • 是的,所以你的意思是每 xxx 毫秒调用一次异步搜索?一般来说,我有时会觉得很烦人,你最终会查询你没有完成的短语,所有这些都是为了不按 Enter 键而加载的。也许我有点懒!大声笑我的人仍然认为它会令人印象深刻并且看起来更好!

标签: multithreading algorithm search


【解决方案1】:

搜索查询通常很小,因此服务器上增加的负载可能没有您想象的那么大。只要您限制查询的长度,就可以在每次击键时发送查询。

反正是服务器知道负载多少,所以把负载管理放在服务器端。例如,您可以遵循如下策略:

在客户端:

  • 当搜索文本发生变化时,将其发送到服务器。
  • 当服务器发送一些结果时,更新页面。

在服务器上,当从客户端收到查询时:

  • 如果我已经在处理来自该客户端的查询,请取消旧查询。
  • 如果我有来自该客户端的排队查询,请将其丢弃。
  • 将新查询添加到待处理的搜索查询队列中,除非队列已满。

【讨论】:

  • 您对服务器的看法是有道理的,但在实施方面却是一个棘手的问题。假设使用 wcf 数据服务 (OData) 向客户端公开数据,我将不得不对其进行某种包装服务来检查排队的查询并取消它们,对吗?
猜你喜欢
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多