You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决新版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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:05:25