优化后端搜索引擎的设计

时间:2015-02-24 20:05:42

标签: mongodb optimization elasticsearch redis

  

TL; DR :这个问题与optimizing the design of a backend search engine有关:我们的想法是返回一个完整的html页面,尽快显示搜索结果。

我认为elasticsearchredis适合这份工作,但我还没有决定。 服务器将是node.js,数据库为mongoDB

  

不会使用前端框架,服务器将返回普通的html。


我提出了以下服务器端设计*:

(*)注意:我在服务器端设计方面经验不足,所以我的方法可能很幼稚

首次搜索

- 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.

让我们进一步详细说明一下:

想象一下,你有一个相当大的文章集合,比如100,000,你打算在你的网站上出售。

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

要实现搜索,文章集合已为indexed in elasticSearch

第一个弹性搜索查询将返回json containing a list of articles

对具有相同搜索词的elasticSearch的后续查询将返回相同的json,但现在将extract it from the elasticSearch cache

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

  • 如果您缓存了whole html page into a superfast key/value database like Redis,则后续搜索中不会使用templator和elasticSearch:Redis会识别搜索字词,并立即返回html。

  • 或者,如果在评论/答案中建议跳过Redis,那么临时工具计算后的html could be stored into a cdn


问题:

  

请说明建议设计的哪些步骤不必要/缺失,以及原因。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

评论摘要:

  1. 您不需要Redis进行缓存,因为EL负责所有这些并且它可以以相同的方式进行扩展。 http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/filter-caching.html

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

  3. 对于热门/热门静态页面,您可以在选择的Web服务器之前轻松获得一个Varnish,并且可以提供10k ops / sec

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

  5. 不要将模板和从存储访问的时间放在相同的存储桶中。虽然我认为第一个将在1毫秒以下,但后者 - 在一个好的集群上可能是50毫秒。也许你将从所有其他路线(DNS,负载平衡器,日志记录)再有50ms,所以我认为这样你可以在110ms以下的时间内完成整个静态的工作。

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

答案 1 :(得分:2)

恕我直言,你不想使用REDIS,只是为此查询elasticsearch。 ES是一个非常复杂的搜索引擎,可以让你远远超出开箱即用。 如果你使用REDIS进行缓存,你将首先查询redis,如果你有一个CACHE_MISS,你可以查询elasticsearch。 我推荐这个YouTube视频,以便第一印象魔术弹性搜索将您交给您:http://www.youtube.com/watch?v=52G5ZzE0XpY

BTW:如果存储键/值,则弹性搜索不会仅存储json'但值尽可能高效地存储。如果它是一个整数,则它被存储为整数...

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