我的应用程序允许在单个请求中更新多个elasticsearch documents
。
我使用ElasticSearch BulkRequestBuilder
来批量更新所有此类文档。
BulkRequestBuilder bulkRequestBuilder = elasticSearchClient.prepareBulk();
documents.forEach(id -> {
UpdateRequest updateRequest = new UpdateRequestBuilder(elasticSearchClient)
.setType("MyDocumentType")
.setIndex("MyDocumentIndex")
.setId(id)
.setDoc("fieldName", "valueToBeUpdated")
.request();
bulkRequestBuilder.add(updateRequest);
});
//update in bulk
bulkRequestBuilder.get();
所有文档都用valueToBeUpdated
更新,但是ElasticSearch在内部花费时间来更新所有文档,但是对bulkRequestBuilder.get()
的调用甚至在文档更新之前就返回了。 (表明ElasticSearch引擎的Async
性质)。
有人可以建议如何使其成为所有文档的Sync
更新吗?
答案 0 :(得分:0)
通常,索引/更新大量数据的问题来自ES的segment merging
。
ES人员的一个秘诀是在索引/更新大量数据之前禁用刷新。
在索引到refresh_interval=-1
之前,您可以实现此更新索引refresh_interval,并且在对所有数据建立索引之后,将其返回到先前的索引配置。
答案 1 :(得分:0)
最后,我发现核心问题(可能是默认问题)是ElasticSearch
引擎进行更新需要花费时间。
默认情况下,ElasticSearch引擎的更新本质上是ASYNC
(正如我在问题中已经指出的那样)。有几个链接可以解释这种默认行为。
例如ElasticSearch GET
API Documentation指出,为了获取文档,elasticsearch引擎执行了refresh
以查看所有先前的更新(如果有)。这暗示着ASYNC
的弹性搜索性质导致我的文档被立即搜索,而没有向我提供更新的文档。
到目前为止,要继续执行现有行为,请按以下步骤在SYNC
中触发批量更新。
bulkRequestBuilder.setReplicationType(ReplicationType.SYNC).setRefresh(true).get();