我能用多快的速度从Elastic Search获得10亿个文档的结果

时间:2016-03-17 03:54:48

标签: elasticsearch

如果我只在一个弹性搜索服务器(https://www.elastic.co/)中存储了10亿条记录,那么查询索引时我能获得简单查询结果的速度有多快?不到一秒钟?

1 个答案:

答案 0 :(得分:1)

我想根据我在这方面的经验使“这取决于”更具体一点,因为答案是“是的,如果您使用足够多的正确类型的计算,它可能需要几十毫秒。”

Elasticsearch 是 Lucene 的分布式分片方案。那么首先,Lucene 的执行速度有多快?那是一个Java库,那么好吧,JVM的执行速度有多快?当您深入研究最后一个问题时,您会意识到您实际上是在问“我能以多快的速度执行程序”。这显然取决于程序是什么。你可以在 Elasticsearch 集群上运行的程序实际上可能非常复杂,所以问“Elasticsearch 的工作速度有多快”意义不大。没有指定。

相反,我们可以尝试为通用搜索程序建模。它大致分为两个阶段:查询和获取。如果您不需要从 Elasticsearch 中获取文档,只需要获取文档 id,这将为您节省大量时间。您需要提取的文档内容越多,所需的时间就越长。同样,在查询阶段,模型最终并不复杂:您将对 x 个文档进行评分,每个评分函数执行需要 y 时间。

然后您的选择是最小化 x 或 y 或两者。

举一个稻草人的例子,如果当你查询时你已经知道要搜索的日期,并且你通过在一年中每天平均添加相同的数量来累积文档,那么你只搜索了大约 2,739,726 个用于该搜索的文档.如果您进行全文搜索并且能够关闭 track_total_hits(从而使用 WAND),您甚至不会对这些文档中的每一个进行评分。

另一方面,如果您需要针对每个搜索请求对索引中的每个文档进行评分,只需做一些数学计算——您的评分函数需要多快才能在 1 秒内对 10 亿个项目进行评分? 1 纳秒。因此,无论您的评分函数是什么(您编写的查询),它是否可以在 1 纳秒内执行,并且 1 秒的响应时间是否可以接受?如果您需要一次执行多次搜索怎么办?

在实践中,在运行 ES 集群时,您会尽量为域模型最小化 x 和 y,并使用类似 rally 之类的东西来进行负载测试和验证。根据我的经验,在大多数用例中,最小化 x 通常比最小化 y 更容易,换句话说,尝试弄清楚如何在搜索时进行过滤。

那么在 Elasticsearch 中搜索 10 亿个文档的速度有多快?现在希望你明白“这取决于!”