我能以多快的速度从包含 10 亿个文档的弹性搜索中获得结果



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

我想

根据我这样做的经验使"这取决于"更具体一点,因为答案是"是的,如果你使用足够多和正确的计算方式,它可能是几十毫秒。

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 亿个文档的速度有多快呢?现在希望你明白"这取决于!

最新更新