如何解决新版Java Elasticsearch客户端查询超时问题?
本地Elasticsearch 8.7.0查询超时问题排查与解决
问题现象
本地部署的Elasticsearch 8.7.0服务器执行查询操作时,部分请求出现超时,抛出java.net.SocketTimeoutException异常。查询本身执行异常缓慢,但相同连接下进行批量索引操作(每秒数千文档,持续5小时)却无任何问题。
异常堆栈信息
java.net.SocketTimeoutException: 30.000 milliseconds timeout on connection http-outgoing-3 [ACTIVE] at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:915) at org.elasticsearch.client.RestClient.performRequest(RestClient.java:300) at org.elasticsearch.client.RestClient.performRequest(RestClient.java:288) at co.elastic.clients.transport.rest_client.RestClientTransport.performRequest(RestClientTransport.java:147) at co.elastic.clients.elasticsearch.ElasticsearchClient.search(ElasticsearchClient.java:1833) at co.elastic.clients.elasticsearch.ElasticsearchClient.search(ElasticsearchClient.java:1850) at sid.EntitySearcher.ElasticEntitySearcher.executeElasticQuery(ElasticEntitySearcher.java:195) at sid.EntitySearcher.ElasticEntitySearcher.getScoredElasticResults(ElasticEntitySearcher.java:242) at sid.EntitySearcher.ElasticEntitySearcher.scoredSearch(ElasticEntitySearcher.java:54) at sid.Evaluation.Evaluator.runQueriesAndSaveAsTRECResultsFile(Evaluator.java:81) at sid.MetricsBulkTesting.testSingleEngine(MetricsBulkTesting.java:308) at sid.MetricsBulkTesting.testSingleEngines(MetricsBulkTesting.java:430) at sid.MetricsBulkTesting.main(MetricsBulkTesting.java:84) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:578) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) at org.springframework.boot.loader.Launcher.launch(Launcher.java:95) at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) Caused by: java.net.SocketTimeoutException: 30.000 milliseconds timeout on connection http-outgoing-3 [ACTIVE] at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.timeout(HttpAsyncRequestExecutor.java:387) at org.apache.http.impl.nio.client.InternalIODispatch.onTimeout(InternalIODispatch.java:98) at org.apache.http.impl.nio.client.InternalIODispatch.onTimeout(InternalIODispatch.java:40) at org.apache.http.impl.nio.reactor.AbstractIODispatch.timeout(AbstractIODispatch.java:175) at org.apache.http.impl.nio.reactor.BaseIOReactor.sessionTimedOut(BaseIOReactor.java:261) at org.apache.http.impl.nio.reactor.AbstractIOReactor.timeoutCheck(AbstractIOReactor.java:502) at org.apache.http.impl.nio.reactor.BaseIOReactor.validate(BaseIOReactor.java:211) at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:280) at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104) at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591) at java.base/java.lang.Thread.run(Thread.java:1589)
已尝试的无效解决方案
- 配置客户端KeepAlive策略及IOReactor参数:
RestClient restClient = RestClient .builder(new HttpHost(host, port, "https")) .setHttpClientConfigCallback(hc -> hc .setSSLContext(sslContext) .setDefaultCredentialsProvider(credsProv) .setKeepAliveStrategy((response, context) -> 300000/* 5 minutes*/) .setDefaultIOReactorConfig(IOReactorConfig.custom().setSoKeepAlive(true).build()) ) .build(); // Create the transport and the API client ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
- 在搜索请求中设置timeout为180s:
SearchResponse<EntityDocument> response = connector.getClient().search(s -> s .index(connector.getIndexName()) .timeout("180s") .query(q -> q .match(t -> t ...query stuff ) ), EntityDocument.class );
- 首次超时后重新建立连接,问题依旧。
最终解决方法
根本原因是查询了n-gram子字段,修改查询逻辑后,查询耗时降至毫秒级,超时问题彻底解决。
内容的提问来源于stack exchange,提问作者Lightsong
相关产品推荐
相关产品推荐

