优化后端搜索引擎的设计

Optimizing the design of a backend search engine

TL;DR: this question is about optimizing the design of a backend search engine: the idea is to return a fully-formed html page that displays search results as quickly as possible.

我认为 elasticsearch and redis 是这份工作的合适人选,但我还没有决定。 服务器将是 node.js, the database mongoDB.

No frontend framework will be used, plain html will be returned by the server.


我想出了以下 server-side 设计*:

(*) 注意:我在 server-side 设计方面经验不多,所以我的方法可能很幼稚

A 第一次搜索 会:

- run a server function that makes an elasticSearch query and returns some json;

- create scraps of HTML from the returned json and store them in Redis
  (for caching purposes);

- store the search keywords and the keys of the html scraps in Redis.

后续搜索 只会:

- recognize the search keywords, and get the html scraps keys from Redis;

- get the html scraps values;

然后服务器会:

- build the html page from the scraps; 

- Return the html page.

让我们用一个例子进一步说明:

假设您有相当多 collection 篇文章,比如说 100,000 篇,您打算在您的网站上出售这些文章。

All articles are stacked in a MongoDb database 并有多个键(标题、类别、评论、图片等...)

为了实现搜索,文章 collection 已 indexed in elasticSearch

第一个 elasticSearch 查询将 return json containing a list of articles

使用相同搜索词对 elasticSearch 的后续查询将 return 相同 json,但现在 extract it from the elasticSearch cache.

但是如果您不使用前端技术并希望从服务器 plain html returned,您仍然需要 insert that json into a templator, create an html page, then return to the end user.


问题:

Please specify which steps of suggested design are unnecessary/missing, and why.

感谢您的帮助!

恕我直言,您不想使用 REDIS,而只是为此查询 elasticsearch。 ES 是一个非常复杂的搜索引擎,应该可以让您开箱即用。 如果您使用 REDIS 进行缓存,您将首先查询 redis,如果您得到 CACHE_MISS,您将查询 elasticsearch。 我推荐这个 youtube 视频来获得第一印象 elasticsearch 给你的是什么神奇的东西:http://www.youtube.com/watch?v=52G5ZzE0XpY

顺便说一句:elasticsearch 不存储 'only json',如果存储 key/values,但值会尽可能高效地存储。如果它是一个整数,它被存储为一个整数...

编辑:我建议至少在开发阶段使用 kibana。如果您对通过 kibana 查询的内容感到满意,则可以创建普通的 html 网站。 此外,您可能想看看 elasticsearch-kopf 以深入了解 ES。

评论总结:

  1. 您不需要使用 Redis 进行缓存,因为 EL 会处理所有这些事情,而且它的可扩展性也是一样的。 http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/filter-caching.html

  2. 您不应该存储整个 HTML,您不需要那个阶段,因为 EL 会在 50 毫秒内响应您的结果。

  3. 对于hot/trending静态页面,你可以很容易地在你选择的网络服务器之前有一个Varnish,它可以承载10k ops/sec

  4. 使用 CDN,仅当 CDN 成本低于为可以即时生成它的实例支付的费用时。

  5. 不要将模板时间和从存储访问时间放在同一个桶中。虽然我认为第一个将在 1 毫秒以下,但后者 - 在一个好的集群上可能是 50 毫秒。也许所有其他路由(DNS、负载均衡器、日志记录)还有 50 毫秒,所以我认为这样您可以在 110 毫秒内为整个静态事物提供服务。

    • 如果你要使用 Elasticsearch,你根本不需要 MongoDB,因为 EL 也是一种文档存储。