elasticsearch中设置查询的请求超时时间

参考:https://www.phpmianshi.com/?id=251

背景

因为我们的项目是用的php,为了防止调用搜索时,请求处理时间太长,导致php-fpm占满,所以需要对外部接口设置请求的超时时间,避免过多的超时请求,我们可以用过对es的参数限制,设置超时时间

 

search 请求参数

  • from

从索引的第几条数据开始返回,默认是 0;

  • size

返回多少条数据,默认是 10。

注意:Elasticsearch 集群实际是需要给 coordinate node 返回 shards number * (from + size) 条数据,然后在单机上进行排序,最后给客户端返回这个 size 大小的数据的。所以请谨慎使用 from 和 size 参数。

此外,Elasticsearch 2.x 还新增了一个索引级别的动态控制配置项:index.max_result_window,默认为 10000。即 from + size 大于 10000 的话,Elasticsearch 直接拒绝掉这次请求不进行具体搜索,以保护节点。

另外,Elasticsearch 2.x 还提供了一个小优化:当设置 "size":0 时,自动改变 search_type 为 count。跳过搜索过程的 fetch 阶段。

  • timeout

coordinate node 等待超时时间。到达该阈值后,coordinate node 直接把当前收到的数据返回给客户端,不再继续等待 data node 后续的返回了。

注意:这个参数只是为了配合客户端程序,并不能取消掉 data node 上搜索任务还在继续运行和占用资源。

  • terminate_after

各 data node 上,扫描单个分片时,找到多少条记录后,就认为足够了。这个参数可以切实保护 data node 上搜索任务不会长期运行和占用资源。但是也就意味着搜索范围没有覆盖全部索引,是一个抽样数据。准确率是不好判断的。

  • request_cache

各 data node 上,在分片级别,对请求的响应(仅限于 hits.total 数值、aggregation 和 suggestion 的结果集)做的缓存。注意:这个缓存的键值要求很严格,请求的 JSON 必须一字不易,缓存才能命中。

另外,request_cache 参数不能写在请求 JSON 里,只能以 URL 参数的形式存在。示例如下:

curl -XPOST http://localhost:9200/_search?request_cache=true -d '
{
    "size" : 0,
    "timeout" : "120s",
    "terminate_after" : 1000000,
    "query" : { "match_all" : {} },
    "aggs" : { "terms" : { "terms" : { "field" : "keyname" } } }
}
'

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在使用 Jest 客户端执行 Elasticsearch 操作时,可以通过设置 `requestTimeout` 参数来设置请求超时时间。`requestTimeout` 参数表示请求的最长等待时间,单位为毫秒。如果在这个时间内没有收到 Elasticsearch 的响应,那么会抛出 `SocketTimeoutException` 异常。 以下是一个设置请求超时时间为 5 秒的示例: ```java import io.searchbox.client.JestClient; import io.searchbox.client.JestClientFactory; import io.searchbox.client.config.HttpClientConfig; import io.searchbox.client.http.JestHttpClient; public class JestClientExample { public static void main(String[] args) { JestClientFactory factory = new JestClientFactory(); factory.setHttpClientConfig(new HttpClientConfig .Builder("http://localhost:9200") .requestTimeout(5000) .build()); JestClient client = factory.getObject(); // 执行 Elasticsearch 操作 // ... client.shutdownClient(); } } ``` 在上面的示例,我们使用 `HttpClientConfig` 类的 `requestTimeout` 方法来设置请求超时时间为 5 秒。注意,这里的单位是毫秒。如果你需要设置更长或更短的超时时间,可以根据实际情况进行调整。 ### 回答2: Jest.execute是一个用于执行Elasticsearch查询的方法,它允许你设置超时时间以控制查询的执行时间。在Jest.execute方法,可以通过设置RequestConfig对象来设置超时时间。 首先,你需要创建一个RequestConfig对象,并设置所需的超时时间。可以使用RequestConfig.Builder来创建RequestConfig对象,并使用setConnectTimeout和setSocketTimeout方法来设置连接和套接字超时时间。连接超时时间表示建立与Elasticsearch服务器的连接所允许的最大时间,套接字超时时间表示从服务器获取响应的最长时间。例如,如果你想将超时时间设置为10秒,可以使用以下代码: ```java RequestConfig requestConfig = RequestConfig.custom() .setConnectTimeout(10000) .setSocketTimeout(10000) .build(); ``` 然后,在执行查询之前,需要构建一个JestClient对象,并将先前创建的RequestConfig对象赋值给JestClient对象的Builder。代码示例如下: ```java JestClientFactory factory = new JestClientFactory(); factory.setHttpClientConfig(new HttpClientConfig.Builder("http://localhost:9200") .requestConfig(requestConfig) .build()); JestClient client = factory.getObject(); ``` 现在,你可以使用JestClient对象执行查询,并在执行期间,Jest.execute方法将遵循设置超时时间。如果查询的执行时间超过超时时间,Jest.execute方法将抛出一个ElasticsearchTimeoutException异常。 需要注意的是,Jest.execute方法的超时时间仅适用于单个查询的执行时间,并不适用于批量查询或多个并发查询的执行时间。 ### 回答3: 在Elasticsearch使用Jest库执行查询时,可以设置超时时间来控制查询操作的执行时间。Jest库是用于Elasticsearch的Java HTTP客户端库,可以方便地与Elasticsearch进行交互。 要设置Jest.execute的超时时间,可以通过创建自定义的JestClient来实现。首先,需要导入必要的Jest库依赖,然后创建一个JestClient实例。 ```java import io.searchbox.client.JestClientBuilder; import io.searchbox.client.config.HttpClientConfig; import io.searchbox.core.Search; import io.searchbox.core.SearchResult; public class ElasticsearchTimeoutExample { public static void main(String[] args) throws Exception { // 设置连接Elasticsearch的URL和端口 String url = "http://localhost:9200"; // 创建JestClientBuilder实例 JestClientBuilder builder = new JestClientBuilder(); // 配置JestClient的HTTP客户端 HttpClientConfig clientConfig = new HttpClientConfig.Builder(url) .multiThreaded(true) .readTimeout(10000) // 设置读取超时时间为10秒 .build(); // 设置JestClient的HTTP客户端配置 builder.setHttpClientConfig(clientConfig); // 创建JestClient实例 JestClient jestClient = builder.build(); // 创建Search请求 Search search = new Search.Builder("{\n" + " \"query\": {\n" + " \"match_all\": {}\n" + " }\n" + "}") .addIndex("myindex") .addType("mytype") .build(); // 发送Search请求设置超时时间 SearchResult result = jestClient.execute(search); // 处理查询结果 if (result.isSucceeded()) { System.out.println("Query executed successfully."); } else { System.out.println("Query failed: " + result.getErrorMessage()); } // 关闭JestClient jestClient.shutdownClient(); } } ``` 在上面的代码,我们通过调用HttpClientConfig.Builder类的readTimeout方法来设置读取超时时间为10秒。然后,将此配置应用于JestClientBuilder实例,并最终创建JestClient对象。 接下来,我们创建一个Search对象,其包含我们要执行的查询,并使用JestClient的execute方法发送查询请求。最后,我们根据查询结果是否成功来处理结果。 注意,如果Jest.execute的超时时间设置得太短,可能会导致查询没有足够的时间来完成,从而返回超时错误。因此,我们需要根据实际情况来合理设置超时时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值