正如贾瓦娜所说,这取决于。主要是:(1)索引率;(2) 文件大小;(3) 搜索的速率和延迟要求;(4) 搜索类型。
考虑到这一点,我们能提供的最好的帮助就是举例。在我们的网站(新闻监控)上,我们:
- 每分钟索引超过 100 个文档。目前,我们拥有近 5000 万份文档。我还听说过包含数亿个文档的 ES 索引。
- 文档是带有一些元数据的新闻文章,不短但也不大。
- 我们的搜索延迟在约 50 毫秒(普通和稀有术语)到常见术语(停用词,我们对其进行索引)到 800 毫秒之间变化。这种变化主要是由于我们的自定义评分(由于 Lucene/ES 支持对其进行自定义)以及数据集(倒排列表)不完全适合内存(OS 缓存)的事实。所以当它碰到一个缓存的倒排列表时,它会更快。
- 我们
OR
使用很多术语进行查询,这些术语是最难的术语之一。我们还对两个单值字段进行分面。并对日期方面进行一些实验(以显示随着时间的推移的发布率)。
我们使用 4 个 EC2 的m1.large
实例来完成所有这些工作。现在我们计划迁移到刚刚发布的 ES 0.9 版本,以获得 Lucene 4.0 的所有优点和性能改进。
现在把例子放在一边。ElasticSearch 具有很强的可扩展性。很简单,用N个shards和M个replicas创建索引,然后用ES创建X台机器。它将相应地分配所有分片和副本。您可以随时更改副本数量(针对每个索引)。
一个缺点是您无法在创建索引后更改分片数量。但是您仍然可以事先“过度分片”,以便在需要时为扩展留出空间。或者创建一个具有正确数量的分片的新索引并重新索引所有内容(我们这样做)。
最后,ElasticSearch(以及Solr)在底层使用了 Lucene Search 库,这是一个非常成熟且广为人知的库。