首页 > 解决方案 > 从 elasticsearch 下载 300,000+ 行作为 .csv 文件

问题描述

您好,我在 nodejs 中有一个网站,在 Elasticsearch 中有一个数据库。索引“bigData*”有 366,844 行,每行有 25 个项目,每个项目是一个不同的字符串,大小不一,最大约为 100 个字符。我正在将此索引查询到我在页面上显示的数据表中,我使用滚动将元素逐渐加载到表中并将其显示在页面上。Datatables 有一个“全部下载”选项,但它只会下载页面上加载的内容。我正在尝试实现一个真正的“全部下载”,它将获取所有 366,844 行,将其编译成文件(csv),然后从网页下载。

我尝试使用滚动,就像它用来加载数据的方式一样,反复调用我的数据库以获取 10,000 行。每次耗时 30 秒,总共 20 分钟。

我知道这样的事情可能需要一些时间,我不期待即时解决方案。但我的方法也让 chrome 变得非常迟钝和缓慢,甚至一度几乎崩溃。有人推荐下载这么多数据吗?甚至可能是我的项目的 npm 包或库,可以在后台准备好下载。

谢谢

标签: javascriptdatabaseelasticsearchnpm

解决方案


这里有几件事:

  1. 当显示如此多的行时,您可能希望使用虚拟滚动来将 DOM 元素(<tr>, <td>, ...)的数量保持在正常水平并防止滚动减速和卡顿。您使用的是 vanillaJS 还是某些框架?那里有一大堆虚拟滚动库。
  2. 如果 10,000 行需要 30 秒,则以较小的批次 (~200-500) 进行查询。当您的用户向下滚动时,另一个批处理查询将已被解析并可以呈现。
  3. 听起来您总是想下载所有 366,844 行——没有应用过滤器。如果是这种情况,除此之外,我会以合理的时间间隔执行S3 存储桶 csv 'dumps'(可能是每个备份都覆盖同一个文件),并将最新的文件直接链接到<a href="..." target="_blank" >. 这样,您的网站就会保持整洁,并且客户可以在自己方便的时候下载 CSV。

推荐阅读