当前位置: 首页 > 知识库问答 >
问题:

Rest高级客户端:请求超时不起作用

洪博涛
2023-03-14

我们试图在查询中使用请求超时,但它似乎不适合我们。

以下是我们在安装过程中所做的工作:

  • 搜索。default\u allow\u partial\u结果:false(在服务器端和客户端上)
  • 在我们命中的每个搜索查询中设置10ms的超时。(客户端)
  • 除此之外,我们还设置了全局超时,如下代码所示:
RestHighLevelClient client = new 
RestHighLevelClient(RestClient.builder(httpHost).setRequestConfigCallback(
    requestConfigBuilder -> requestConfigBuilder
    .setConnectTimeout(30000)
    .setConnectionRequestTimeout(90000)
    .setSocketTimeout(90000)).setMaxRetryTimeoutMillis(90000));

查询耗时超过8秒,但仍未超时。我们已经禁用了部分结果,希望得到一个超时错误,但我们也没有得到任何错误。

此外,即使查询花费的时间超过了指定的超时时间,isTimedOut标志也始终返回为false。

这是我正在查询的请求示例:

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    QueryBuilder infraQueryBuilder = QueryBuilders.termQuery("field1", field1);
    QueryBuilder totalCountRangeQueryBuilder = QueryBuilders.rangeQuery("field2").gte(3);

    BoolQueryBuilder innerBoolQueryBuilder = QueryBuilders.boolQuery();
    innerBoolQueryBuilder.must(QueryBuilders.rangeQuery("nestedDocType1.field1").gt(2));

    QueryBuilder filter = QueryBuilders
        .nestedQuery("nestedDocType1", innerBoolQueryBuilder, ScoreMode.Max)
        .innerHit(new InnerHitBuilder()
            .setFetchSourceContext(
                new FetchSourceContext(true, new String[]{"nestedDocType1.field1"}, null))
            .addSort(SortBuilders.fieldSort("nestedDocType1.field1").order(SortOrder.DESC))
            .setSize(1)
        );

    boolQueryBuilder.must(infraQueryBuilder);
    boolQueryBuilder.must(totalCountRangeQueryBuilder);

    if (inputRevisions != null && (inputRevisions.size() > 0)) {
      QueryBuilder allEligibleRevisionsFilter = QueryBuilders
          .termsQuery("field3", inputRevisions);
      boolQueryBuilder.must(allEligibleRevisionsFilter);
    }

    boolQueryBuilder.filter(filter);

    sourceBuilder.query(boolQueryBuilder)
        .fetchSource(new String[]{
            "field3",
            "field2"
        }, null);

    sourceBuilder.size(batchSize);
    sourceBuilder.timeout(TimeValue.timeValueMillis(10));

    SearchRequest searchRequest = createSearchRequest(sourceBuilder, enterpriseId);
    searchRequest.allowPartialSearchResults(false);

    SearchResponse searchResponse = getSearchResponse(searchRequest);

    ESCustomScroll<Set<String>> esCustomScroll = this::populateProcessedRevisionsSetWithESScroll;
    getESDataByScroll(esCustomScroll, searchResponse, processedRevisions);  // gets the data by scrolling over again and again until data is available.

这是我们用于滚动的代码:

private boolean populateProcessedRevisionsSetWithESScroll(SearchResponse searchResponse, Set<String> processedRevisions) {
            if(searchResponse == null ||
                searchResponse.getHits() == null ||
                searchResponse.getHits().getHits() == null ||
                searchResponse.getHits().getHits().length == 0) {
              return false;
            }

            for(SearchHit outerHit : searchResponse.getHits().getHits()) {
              Map<String, Object> outerSourceMap = outerHit.getSourceAsMap();

              String revision = (String) outerSourceMap.get("field4");
              int totalCount = (Integer) outerSourceMap.get("field3");

              SearchHit[] innerHits = outerHit.getInnerHits().get("nestedDocType1").getHits();

              if(innerHits == null || innerHits.length == 0) {
                logger.error("No inner hits found for revision: "+revision);
                continue;
              }

              Map<String, Object> innerSourceMap = innerHits[0].getSourceAsMap();
              int simCount = (Integer) innerSourceMap.get("field1");

              if(((totalCount - simCount) == 0) || (simCount > ((totalCount - simCount) / 2))) {
                processedRevisions.add(revision);
              }
            }

            return true;
          }

即使在部分结果的情况下,我们也希望设置isTimedOut标志。但事实并非如此。

你能告诉我们哪里错了,我们错过了什么吗?

相关问题:虽然设置了超时,但Java高级Rest客户端没有释放连接

共有1个答案

柳杰
2023-03-14

尝试为RestClientBuilder设置setMaxRetryTimeoutMillis–它将创建一个侦听器,并在setMaxRetryTimeoutMillis过期后将其切断。

 类似资料:
  • rest客户端从不超时。在多个请求之后,quarkus停止服务新的请求。也尝试了.../mp-rest/connecttimeout=5000.../mp-rest/readtimeout=5000但没有成功。 界面看起来像

  • 这是我的第一个问题。我必须使用ES rest高级客户端。我的ES服务器是6.8。x、 所以我写了我的构建。gradle文件。 但我的项目依赖性如下所示。 Gradle:org.elasticsearch.client:elasticsearch ch-rest-客户端:7.6.2 Gradle:org.elasticsearch.client:elasticsearch ch-rest-高级别-客

  • 如果有人能告诉我一种使用REST高级客户端或JAVA中的任何其他方式从JAVA执行时间点API请求的方法,这将非常有用,Elasticsearch 7.10.1中新引入了该方法。(传输客户端除外,因为它将很快被弃用)

  • 我正在尝试从ElasticSearch 2过渡到5或6。我想我想直接跳到6.1.1并使用RestHighLevelClient,因为它比低级rest客户端更接近我正在使用的现有传输客户端。 但是,我遇到了一个问题作为集成测试的一部分,我正在创建索引并插入特定数据,因此我知道我的查询是正确的。我似乎无法在High Level客户端中做到这一点。特别是,我希望能够调用: 但是,client.indic

  • 我得到以下异常,而试图使用Elasticsearch高Rest客户端。 我使用的是Spring Boot 2.0.4和Elasticsearch 6.4版本。。用例只是用一些数据创建一个索引,然后检索相同的数据。。 我刚刚遵循了elasticsearch文档中的依赖项,并正确地进行了设置。 我对Gradle的依赖是 为了简单起见,给出了代码的简短版本。。 有人能帮忙吗?

  • 使用Elasticsearch原生Java客户端API()的应用程序升级到使用Java高级REST客户端的路径是什么? 文件(初步?)似乎表明: Java高级REST客户端依赖于Elasticsearch核心项目。它接受与TransportClient相同的请求参数,并返回相同的响应对象。 (来源:https://www.elastic.co/guide/en/elasticsearch/clie