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

说明:如何使用rest高级客户端和Spring实现分页?

谭京
2023-03-14

我在从传输客户端迁移到Rest高级客户端时遇到问题。下面的代码不适用于RestHighLevelClient,我想使用它来获取类类型的聚合页面的响应。

elasticsearchTemplate.queryForPage(searchQuery, Class.class)

我们也欢迎任何用其他方法实现同样目标的建议。

共有2个答案

殷烨
2023-03-14

这对我有用

public Page<T> search(){
           Query query;
            SearchHits<T> t;
            Criteria nameCriteria = new Criteria("name").is(text).and(new 
            Criteria("jsonNode").in(String ...)); //This can be any Aggregator
            query = new CriteriaQuery(nameCriteria).setPageable(paging);
            searchHits = elasticsearchOperations.search(query, T.class);
            return (Page) SearchHitSupport.searchPageFor(searchHits, query.getPageable());;
}
 
戴博
2023-03-14

我在不使用Spring data elasticsearch的情况下使用restHighLevelClient的解决方案包含在以下代码中(这不是解决方案,但可能对您的解决方案有所帮助):

        BoolQueryBuilder criteriaQuerySpecification = getCriteriaQuerySpecification(transactionFilter);

        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.sort(new FieldSortBuilder("operation_created_at").order(SortOrder.DESC));
        sourceBuilder.query(criteriaQuerySpecification);

        SearchRequest searchRequest = generateSearchRequest(totalElementsInt, pageNumberInt, sourceBuilder);
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        List<OperationDto > operations = Arrays.asList(hits).stream().map(hit -> {
            hit.getSourceAsString();
         // get operation is a method mapping from hit to your dto using  Map<String, Object> sourceAsMap = hit.getSourceAsMap();
         OperationDto operation = getOperationDto(hit);

            //convert hit to OperationDto
          return operation;
        }).collect(Collectors.toList());


private SearchRequest generateSearchRequest(Integer totalElementsInt, Integer pageNumberInt, SearchSourceBuilder sourceBuilder) {
    SearchRequest searchRequest = new SearchRequest("operation-index").types("operation");
    int  offset = pageNumberInt *totalElementsInt;
    sourceBuilder.from(offset);
    sourceBuilder.size(totalElementsInt);
    sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
    searchRequest.source(sourceBuilder);
    return searchRequest;
}
 类似资料:
  • 如果有人能告诉我一种使用REST高级客户端或JAVA中的任何其他方式从JAVA执行时间点API请求的方法,这将非常有用,Elasticsearch 7.10.1中新引入了该方法。(传输客户端除外,因为它将很快被弃用)

  • Spring Data ES 3.2.0.M1仍然使用旧的而不是 Spring Data ES 3.2.0.M1支持高级REST客户端,请参阅添加对Java高级REST客户端的支持。我添加了Spring Data ES 3.2.0。M1到SB2应用程序: 但是,仍然使用了。有两种迹象表明:启动时的例外情况: 调用ElasticsearchTemplate时出现异常stacktrace 是否有任何配

  • 我正在尝试从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的依赖是 为了简单起见,给出了代码的简短版本。。 有人能帮忙吗?

  • 我使用Retrofit为我的REST API实现了一个Java客户端。客户端是一个简单的java应用程序,而不是Android应用程序。如何为我的Java客户端编写单元测试?以下是我的服务类之一。

  • 我对弹性搜索和Spring都不熟悉。我已经编写了一个Javascript POC,它将JSON字符串转换为Elasticsearch查询(并执行请求)。它需要这样的字符串: (注意:此查询可能有任何嵌套级别) ... 并将其转化为: 它首先为第一次访问Elasticsearch创建一个查询(类似于上述),以提取构建此查询所需的一些信息(“链接”)。每次访问Elasticsearch都可能返回数百万