(如何使用其余高级客户端和spring实现分页?)或elasticsearchTemplate.queryForPage()的替代方法

时间:2019-03-01 10:54:28

标签: elasticsearch

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

elasticsearchTemplate.queryForPage(searchQuery, Class.class)

也欢迎任何使用其他方法实现相同目标的建议。

2 个答案:

答案 0 :(得分:1)

我在不使用Spring数据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;
}

答案 1 :(得分:0)

这对我有用

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());;
}