【问题标题】:How to design the server side of an autocomplete box like Quora?如何设计像 Quora 这样的自动完成框的服务器端?
【发布时间】:2012-09-15 04:26:23
【问题描述】:

我不想使用 Lucene,因为我认为它很重

有没有更简单的方法来实现这个(百万数据)?

【问题讨论】:

  • 我不太了解 Quora,无法回答 - 它只是像许多其他网站(如谷歌)上的自动完成框,还是有什么更特别的地方? ?
  • 嗯,看起来就像谷歌的。

标签: java autocomplete lucene full-text-search search-engine


【解决方案1】:

如果您不想担心性能,我建议您看看 Amazon Web Services 新的 CloudSearch 服务。它速度很快,并且可以随着您的需求扩展而扩展。它还可以毫无问题地处理数百万个文档,并支持通配符搜索(例如:quo*,将检索 Quora)。

查看here

【讨论】:

    【解决方案2】:

    显然,这不是 Quora 或 Google 的工作方式,因为我在这两个地方都没有工作过的乐趣……这就是我要做的事情。

    首先要获得的是搜索词列表 - 我假设您不想知道这是如何完成的,因为它实际上取决于各种各样的事情,但基本上您要么去做一个select distinct title from pages(在维基百科上的自动完成的情况下)或者在谷歌的情况下更高级的东西。

    下一步在高层次上也很简单:如果用户在搜索框中输入Qu,您需要执行查询select title from titles where title like 'Qu%'。然后将标题列表作为对某种 Ajax 请求的响应返回给浏览器,可能是 JSON 或类似的形式。而且你需要尽可能快地做到这一点——这就是困难所在。

    他们是怎么做到这么快的?大概有四点需要牢记。

    1. 他们有很多机器处理请求。请记住,Google 的自动完成功能在默认情况下是打开的,并且适用于(几乎?)所有语言。这是针对自动完成索引的大量搜索。对网络索引本身的影响远不止于此:对于每个网络搜索请求,Google 可能会处理 3 或 4 个自动完成请求。
    2. 他们可能是在记忆中这样做的。众所周知,Google 会将其网络索引存储在内存中,因此我希望他们也会这样做。
    3. 专业软件(这是它真正有趣的地方)。虽然传统数据库或 NoSQL 数据库可以做到这一点并快速做到这一点,但我希望大男孩们实际上会使用专门的代码来做到这一点,其唯一目的是提供自动完成建议。我上面提供的 SQL 语句纯粹是为了演示所需的逻辑请求。您可能正在查看某种特殊的树,例如后缀树、基数树或类似树。
    4. 分片。为了应对数据量和执行请求的机器数量,您需要进行分片。这是确保所涉及的所有机器的某个子集仅处理以一个或多个字母开头的请求请求。例如,一组 X 机器处理以某个字母或什至 2 个字母开头的搜索。这意味着你有更多的机器,但它们并不都必须手头有整个索引。如何选择一组特定的机器?一旦请求在您的数据中心,您要么路由,要么您可以在客户端路由(例如,在您的 Javascript 中,根据搜索词的前 X 个字母决定要查询的 IP)

    所以,我就是这样做的。由于没有经历过 Google/Quora 处理的庞大数据集,我敢肯定有些事情我没有考虑过。但是,这是一个开始。

    而且,我是这样做的,纯粹是在家里的实验环境中:

    我有一个简单的列表,里面有几十万个标题要搜索。这些被加载到一个专用的 MongoDB 集合中,该集合上定义了一个索引。然后我在它前面有一个 Play Framework 控制器,并使用 jQuery 的自动完成插件进行搜索。

    显然,与您所寻找的相比,这很小,但只要您遵循建议(即良好的硬件、大量的 RAM、将索引保存在内存中),MongoDB 应该为您的数据集提供相同的性能。此外,Mongo 支持分片,并且 Play 框架不共享任何内容,因此在这种情况下,如果您的用户群增长,添加新机器以应对负载将很简单。

    顺便说一句,Mongo 绝不是唯一的解决方案,当然,传统的 SQL 数据库也能胜任 - 我只是出于其他原因使用 Mongo。

    【讨论】:

      【解决方案3】:

      首先,对于自动完成,如果您想要快速显示的内容,您的目标应该是在

      见,例如

      http://stackoverflow.com/questions/536300/what-is-the-shortest-perceivable-application-response-delay

      显然,Quora 使用前缀匹配,而不是全文搜索,这使它更快。要推出您自己的基于前缀的快速自动完成功能,这对于许多情况来说应该足够了,但不会使用模糊匹配处理拼写错误等问题,请尝试使用 Redis 等内存数据存储。详情可见这里:

      http://charlesleifer.com/blog/powerful-autocomplete-with-redis-in-under-200-lines-of-python/

      由于 Google 和 Quora I 的低延迟,我无法获得 CloudSearch(由 Firebug 测量,在浏览器中直接从端点获取 95-125 毫秒,并且通过 PHP 中的 cURL 访问端点的时间延长了 20-30 毫秒)无论搜索查询的简单性如何,都被引用。 Elasticsearch 集群要快一些。这些陈述显然取决于用例,可能无法很好地概括,但值得考虑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-07
        • 2011-01-02
        • 2010-11-01
        • 2016-09-01
        • 1970-01-01
        • 2018-06-14
        • 2015-12-24
        • 2012-02-11
        相关资源
        最近更新 更多