Elasticsearch 5.6.15迁移至7.17.18代码适配问题咨询
Elasticsearch 5.6.15 迁移至7.17.18代码适配方案
问题1:DeleteByQueryAction.INSTANCE.newRequestBuilder(client)无法解析
原因
7.x版本中,Elasticsearch废弃了通过Action实例构建RequestBuilder的方式,推荐直接使用DeleteByQueryRequest对象构建请求并调用客户端方法执行。
适配代码
原5.6代码示例:
DeleteByQueryRequestBuilder builder = DeleteByQueryAction.INSTANCE.newRequestBuilder(client); builder.setIndices("your_index"); builder.setQuery(QueryBuilders.matchAllQuery()); builder.get();
适配为7.17代码:
DeleteByQueryRequest request = new DeleteByQueryRequest("your_index"); request.setQuery(QueryBuilders.matchAllQuery()); // 按需添加其他参数设置(如批次大小、超时等) client.deleteByQuery(request, RequestOptions.DEFAULT);
问题2:Retry.on(Exception.class)无法解析
原因
该方法属于旧版Guava Retrying库的API,新版本中已调整为通过RetryerBuilder链式调用定义重试规则,不再支持Retry.on()的写法。
适配代码
原5.6代码示例:
Retryer<Void> retryer = Retry.on(Exception.class) .withMaxAttempts(3) .withWaitDuration(1000) .build();
适配为7.17兼容的代码(需确保依赖新版Guava Retrying库):
Retryer<Void> retryer = RetryerBuilder.newBuilder() .retryIfException() // 替代Retry.on(Exception.class) .withStopStrategy(StopStrategies.stopAfterAttempt(3)) .withWaitStrategy(WaitStrategies.fixedWait(1, TimeUnit.SECONDS)) .build();
问题3:CreateIndexRequest.source()无法传入Map<String, Object>
原因
7.x版本中,CreateIndexRequest.source()的无类型Map重载被移除,需要显式指定内容类型,让Elasticsearch正确解析Map结构。
适配代码
原5.6代码示例:
CreateIndexRequest request = new CreateIndexRequest("your_index"); Map<String, Object> indexSettings = new HashMap<>(); indexSettings.put("number_of_shards", 3); request.source(indexSettings);
适配为7.17代码:
CreateIndexRequest request = new CreateIndexRequest("your_index"); Map<String, Object> indexSettings = new HashMap<>(); indexSettings.put("number_of_shards", 3); // 显式指定内容类型为JSON request.source(indexSettings, XContentType.JSON);
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

