[英]ElasticSearch 1.7 (Spring Data ElasticSearch) update by query takes lot of time to update documents
我的应用程序允许在单个请求中更新多个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()
的调用bulkRequestBuilder.get()
返回。 (指示ElasticSearch引擎的Async
性质)。
有人可以建议如何使其Sync
所有文档吗?
通常,索引/更新大量数据的问题来自ES的segment merging
。 ES人员的一个技巧是在索引/更新大量数据之前禁用刷新。
您可以在索引为refresh_interval=-1
之前实现此更新索引refresh_interval,一旦对所有数据建立索引, refresh_interval=-1
其返回到先前的索引配置。
最终,我发现了ElasticSearch
引擎花费时间进行更新的核心问题(可能是默认性质)。
默认情况下,ElasticSearch引擎更新本质上是ASYNC
(正如我已经在问题中指出的那样)。 有几个链接正在解释此默认行为。
例如,ElasticSearch GET
API 文档指出,为了获取文档,elasticsearch引擎会进行refresh
以查看所有以前的更新(如果有)。 这表明弹性搜索的ASYNC
性质导致我的文档立即搜索,而没有提供更新的文档。
截至目前,要继续执行现有行为,请按如下所示在SYNC
触发批量更新。
bulkRequestBuilder.setReplicationType(ReplicationType.SYNC).setRefresh(true).get();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.