通过查询更新ElasticSearch 1.7(Spring Data ElasticSearch)需要花费大量时间来更新文档

时间:2019-01-14 13:03:12

标签: spring-boot elasticsearch nosql spring-data-elasticsearch

我的应用程序允许在单个请求中更新多个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更新吗?

2 个答案:

答案 0 :(得分:0)

通常,索引/更新大量数据的问题来自ES的segment merging。 ES人员的一个秘诀是在索引/更新大量数据之前禁用刷新。

在索引到refresh_interval=-1之前,您可以实现此更新索引refresh_interval,并且在对所有数据建立索引之后,将其返回到先前的索引配置。

Tune-indexing-speed

答案 1 :(得分:0)

最后,我发现核心问题(可能是默认问题)是ElasticSearch引擎进行更新需要花费时间。

默认情况下,ElasticSearch引擎的更新本质上是ASYNC(正如我在问题中已经指出的那样)。有几个链接可以解释这种默认行为。

例如ElasticSearch GET API Documentation指出,为了获取文档,elasticsearch引擎执行了refresh以查看所有先前的更新(如果有)。这暗示着ASYNC的弹性搜索性质导致我的文档被立即搜索,而没有向我提供更新的文档。

到目前为止,要继续执行现有行为,请按以下步骤在SYNC中触发批量更新。

bulkRequestBuilder.setReplicationType(ReplicationType.SYNC).setRefresh(true).get();