当 Elasticsearch 中有多个版本时,更新生成器会给出延迟响应?



项目 : Spring Boot

我正在使用以下方式更新我的弹性搜索文档,

@Override
public Document update(DocumentDTO document) {
try {
Document doc = documentMapper.documentDTOToDocument(document);
Optional<Document> fetchDocument = documentRepository.findById(document.getId());
if (fetchDocument.isPresent()) {
fetchDocument.get().setTag(doc.getTag());
Document result = documentRepository.save(fetchDocument.get());
final UpdateRequest updateRequest = new UpdateRequest(Constants.INDEX_NAME, Constants.INDEX_TYPE, document.getId().toString());
updateRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL);
updateRequest.doc(jsonBuilder().startObject().field("tag", doc.getTag()).endObject());
UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
log.info("ES result : "+ updateResponse.status());
return result;
}
} catch (Exception ex) {
log.info(ex.getMessage());
}
return null;
}

使用它,我的文档已成功更新并且版本递增,但是当版本变为20+时。

检索数据需要很多时间(大约 14 秒(。

我仍然对版本控制过程感到困惑。它在更新和删除方案中如何工作?在搜索时,它会处理所有数据版本并发送最新版本?是这样吗?

Elasticsearch内部使用Lucene,它使用不可变的段来存储数据。 由于这些段是不可变的,因此 Elasticsearch 上的每次更新都会在内部标记旧文档删除(软删除(并插入一个新文档(具有新版本(。

旧文档稍后在后台段合并过程中进行清理。

新更新的文档应在 1 秒内可用(默认刷新间隔(,但可以禁用或更改,因此请在索引中检查此设置。我可以看到您在代码中使用了wait_for参数,请将其删除,如果您没有更改默认refresh_interval,您应该能够快速看到更新的文档。

注意:- 这里的更新和删除操作的工作方式相似,唯一的区别是在删除操作中不会创建新文档,并且旧文档被标记为软删除,后来在段合并期间永久删除。

最新更新