我有相对较多的文档集,我们通过java rest客户端加载到elasticsearch中。每天我们在午夜进行一批数据加载(基本上是整个数据集),然后整天加载增量文件,这些文件是对现有数据集的更改。
对于完整的数据集,我们将其加载到索引中,然后将别名从旧索引切换到新索引,这样可以很好且快速地工作。
现在问题出在增量文件上。
基本上有两个用于标识文档的主要字段-文档的ID和版本。有几种加载增量文件的方法:
- 当我们从文件中读取每个记录时,我们检查它的版本是否大于Elastic中的版本,并将其放入批处理中进行更新,然后执行更新。对于小文件来说,这很好用,但大文件要花很长时间,因为有数十万次来自Elastic的读取。
- 与#1相同,但要批量读取-即读取1000条记录,从Elastic读取1000条请求ID和版本,与内存中的文件进行比较,然后批量提交到Elastic。可能会正常运行,我们需要查看它会在多大程度上提高性能。
- 将整个ID和版本集读取到内存中,并在读取文件时将其与该内存版本进行比较。对于大型文件,这是可以的,但是对于小型文件,则不是理想的选择,因为我们需要加载大量的ID和版本(尽管对于大型和小型增量文件,我们可以有两个版本)。
- 对外部定义的版本使用弹性版本控制。可能应该可以,但是由于没有一致的错误消息,我们在执行此操作时遇到了一些问题(并且我们需要分析批处理插入的错误,以查看它是否只是较低版本或是否发生了其他问题并进行处理错误)。
- 将整个增量文件加载到弹性文件中,并在可能的情况下进行某种连接(不确定是否可行)
您认为最好的方法是什么?也许还有其他更好的方法可以做到这一点。