我在尝试更新弹性搜索中不存在的文档时遇到了 UpdateByQuery API 的问题
问题描述
我们为每一天创建一个索引,例如 test_index-2020.03.11、test_index-2020.03.12 ……我们维护 8 天(今天和上周的 7 天)索引。
当数据到达时(从 Kafka 主题中逐一或批量读取),如果数据已经存在给定 ID,我们需要更新(可能存在于 8 天索引中的任何一个中),如果不存在则保存(到当前日指数)。
解决方案,我目前正在尝试数据一一到达:
使用带有内联脚本的 UpdateByQuery 来更新文档
如果 BulkByScrollResponse 返回更新计数 0,则保存文档
问题:
即使 doc 仍然不存在,我也可以看到 BulkByScrollResponse 将更新的字段返回为非零(1、2、3、4 ...),如下所示
BulkIndexByScrollResponse[sliceId=null,updated=1,created=0,deleted=0,batches=1,versionConflicts=0,noops=0,retries=0,throttledUntil=0s]
由于这无法触发文档保存请求。
如果需要通过单个请求使用其各自的内容更新大量文档(具有一组不同的文档 ID),如何处理?我可以使用 UpdateByQuery 实现吗?
注意:考虑到每小时要处理的数据量,我们需要避免多次命中 Elasticsearch。
文档 ID 的格式为 str1:str2:Used:Sat Mar 14 23:34:39 IST 2020
但是即使文档不存在,我仍然可以看到更新的计数为非零
关于我正在尝试的方法添加更多几点:-在我的情况下,每个请求总是只有一个文档必须更新,因为我正在尝试更新与给定 ID 匹配的文档 -我们已将分片和副本配置为"number_of_shards": 10, "number_of_replicas": 1 - 我们采用这种方法,因为我们不知道实际文档驻留在哪个索引中
如果最多有一个文档匹配,则响应的更新字段不应超过 1
以下是我作为响应的一部分得到的几个输出: BulkIndexByScrollResponse[sliceId=null,updated=9,created=0,deleted=0,batches=1,versionConflicts=1,noops=0,retries=0,throttledUntil= 0s] BulkIndexByScrollResponse[sliceId=null,updated=10,created=0,deleted=0,batches=1,versionConflicts=0,noops=0,retries=0,throttledUntil=0s]