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

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() returns。 (表明 ElasticSearch 引擎的 Async 性质)。

任何人都可以建议如何使其成为所有文档的 Sync 更新吗?

通常问题 indexing/updating 大量数据来自 segment merging 来自 ES 。 来自 ES 人员的一个提示是在 indexing/updating 大量数据之前禁用刷新。

您可以在索引到 refresh_interval=-1 之前实现此更新索引 refresh_interval,一旦您的所有数据都被索引 return 到您之前的索引配置。

Tune-indexing-speed

我终于找到了 ElasticSearch 引擎更新需要时间的核心问题(可能是默认问题)。

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

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

现在要继续现有行为,请按如下方式在 SYNC 中触发批量更新。

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