es使用restClient,由5.6.14修改为7.10.2

修改pom文件

5.6.14版本

<!-- elasticsearch 搜索引擎 -->
<!--<dependency>-->
    <!--<groupId>org.elasticsearch</groupId>-->
    <!--<artifactId>elasticsearch</artifactId>-->
    <!--<version>5.6.14</version>-->
<!--</dependency>-->
<!--<dependency>-->
    <!--<groupId>org.elasticsearch.client</groupId>-->
    <!--<artifactId>elasticsearch-rest-high-level-client</artifactId>-->
    <!--<version>5.6.14</version>-->
<!--</dependency>-->

7.10.2版本

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.10.2</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.10.2</version>
</dependency>

配置类

配置文件

spring:
  rest:
    host: 192.168.52.38
    port: 9296
    protocol: http
    username:
    password:

配置属性

@Data
@ConfigurationProperties(prefix = "spring.rest")
public class RestProperties {
    private String host;
    private int port;
    private String protocol;
    private String username;
    private String password;
}

5.6.14版本的配置类

@Slf4j
@Configuration
@EnableConfigurationProperties(RestProperties.class)
public class RestClientConfig {

    private final RestProperties properties;

    public RestClientConfig(RestProperties properties){
        this.properties = properties;
    }

    @Bean
    public RestClient restClient(){
        if (StringUtils.isBlank(properties.getHost())){
            return null;
        }
        RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(properties.getHost(), properties.getPort(), properties.getProtocol()));
        if (StringUtils.isNotBlank(properties.getUsername()) && StringUtils.isNotBlank(properties.getPassword())){
            CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(properties.getUsername(), properties.getPassword()));
            restClientBuilder.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
        }
        restClientBuilder.setMaxRetryTimeoutMillis(50000);
        // 异步httpclient连接延时配置
        restClientBuilder.setRequestConfigCallback(builder -> {
            builder.setConnectTimeout(50000);
            builder.setSocketTimeout(50000);
            builder.setConnectionRequestTimeout(50000);
            return builder;
        });
        return restClientBuilder.build();
    }

    @Bean
    public RestHighLevelClient highLevelClient(){
        RestClient restClient = restClient();
        return new RestHighLevelClient(restClient);
    }
}

7.10.2版本的配置类

@Slf4j
@Configuration
@EnableConfigurationProperties(RestProperties.class)
public class RestClientConfig {

    private final RestProperties properties;

    public RestClientConfig(RestProperties properties) {
        this.properties = properties;
    }

    @Bean
    public RestHighLevelClient client() {
        RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(properties.getHost(), properties.getPort(), properties.getProtocol()));
        restClientBuilder.setRequestConfigCallback(builder -> {
            // 连接超时(默认为1秒)
            builder.setConnectTimeout(5000);
            // 套接字超时(默认为30秒)
            builder.setSocketTimeout(60000);
            return builder;
        });
        restClientBuilder.setHttpClientConfigCallback(builder -> {
            // 线程数
            builder.setDefaultIOReactorConfig(IOReactorConfig.custom().setIoThreadCount(1).build());
            return builder;
        });
        return new RestHighLevelClient(restClientBuilder);
    }
}

工具类

5.6.14版本

@Slf4j
@Component
public class RestClientService {

    /**
     * ES最大数据限制
     */
    public static final int MAX_DATA_SIZE = 100;
    @Autowired
    private RestClient client;
    @Autowired
    private RestHighLevelClient highLevelClient;

    /**
     * client操作索引
     *
     * @param method
     * @param endpoint
     * @return
     */
    private boolean performRequest(String method, String endpoint) {
        try {
            Response response = client.performRequest(method, endpoint);
            return response.getStatusLine().getStatusCode() == 200;
        } catch (IOException e) {
            log.error(Constants.COUNT_ERROR, e);
        }
        return false;
    }

    /**
     * client操作文档
     *
     * @param method
     * @param endpoint
     * @param query
     * @return
     */
    private boolean performRequest(String method, String endpoint, String query) {
        HttpEntity entity = new NStringEntity(query, ContentType.APPLICATION_JSON);
        try {
            Response response = client.performRequest(method, endpoint, Collections.emptyMap(), entity);
            String result = EntityUtils.toString(response.getEntity());
            JSONObject jsonObject = JSONObject.parseObject(result);
            return jsonObject.getIntValue("total") > 0;
        } catch (IOException e) {
            log.error(Constants.COUNT_ERROR, e);
        }
        return false;
    }

    /**
     * 创建索引
     *
     * @param indexName 索引名称
     */
    public boolean createIndex(String indexName) {
        if (existsIndex(indexName)) {
            log.debug("createIndex error, cause: {} exists", indexName);
            return false;
        }
        String method = "PUT";
        String endpoint = "/" + indexName;
        return performRequest(method, endpoint);
    }

    /**
     * 删除索引
     *
     * @param indexName 索引名称
     * @return true/false
     */
    public boolean deleteIndex(String indexName) {
        if (!existsIndex(indexName)) {
            log.debug("deleteIndex error, cause: {} not exists", indexName);
            return false;
        }
        String method = "DELETE";
        String endpoint = "/" + indexName;
        return performRequest(method, endpoint);
    }

    /**
     * 判断index 索引是否存在
     *
     * @param indexName
     * @return
     */
    public boolean existsIndex(String indexName) {
        String method = "HEAD";
        String endpoint = "/" + indexName;
        return performRequest(method, endpoint);
    }

    /**
     * 加载文件内容
     *
     * @param filePath
     * @return
     */
    public String loadText(String filePath) {
        String textData = null;
        try {
            ClassPathResource classPathResource = new ClassPathResource(filePath);
            try (InputStream inputStream = classPathResource.getInputStream()) {
                textData = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
            }
        } catch (Exception e) {
            log.error("loadText error:{}", e);
        }
        return textData;
    }

    /**
     * 创建 mapping 映射
     *
     * @param indexName
     * @param typeName
     * @param filePath
     * @return
     */
    public boolean createIndexMapping(String indexName, String typeName, String filePath) {
        String method = "PUT";
        String endpoint = "/" + indexName + "/" + typeName + "/_mapping";
        return performRequest(method, endpoint, loadText(filePath));
    }

    public PageInfo<JSONObject> queryPage(String indexName, String typeName, QueryBuilder queryBuilder, BasePageRequest pageRequest, Set<String> highlightFieldSet, boolean isCollapse) {
        SearchRequest searchRequest = new SearchRequest(indexName);
        searchRequest.types(typeName);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //超出ES最大数据限制,则返回最后一页
        if (pageRequest.getOffsetNum() + pageRequest.getPageSize() > MAX_DATA_SIZE) {
            BigDecimal totalDecimal = BigDecimal.valueOf(MAX_DATA_SIZE);
            BigDecimal pageSizeDecimal = BigDecimal.valueOf((long) pageRequest.getPageSize());
            int pages = totalDecimal.divide(pageSizeDecimal, BigDecimal.ROUND_FLOOR).intValue();
            pageRequest.setPageNum(pages);
        }
        //条件查询
        searchSourceBuilder.query(queryBuilder);
        // 对任务进行去重
        if (isCollapse) {
            searchSourceBuilder.collapse(new CollapseBuilder("taskId.keyword"));
        }
        //分页
        if (Boolean.TRUE.equals(pageRequest.getDoPage())) {
            searchSourceBuilder.from(pageRequest.getOffsetNum());
            searchSourceBuilder.size(pageRequest.getPageSize());
        }
        //排序
        if (Boolean.TRUE.equals(pageRequest.getDoSort())) {
            if (StringUtils.isBlank(pageRequest.getSortColumn())) {
                throw new ZnbkException("当前方法已启用排序,但未指定排序字段[sortColumn]");
            }
            searchSourceBuilder.sort(pageRequest.getSortColumn(), SortOrder.fromString(pageRequest.getSortRule()));
        }
        //设置高亮显示字段
        if (highlightFieldSet != null && !highlightFieldSet.isEmpty()) {
            HighlightBuilder highlightBuilder = new HighlightBuilder();
            for (String highlightField : highlightFieldSet) {
                HighlightBuilder.Field field = new HighlightBuilder.Field(highlightField);
                //.preTags("<em class=\"highlight\" style=\"color:red;\">").postTags("</em>")
                // 高亮字段
                // 添加到 builder
                highlightBuilder.field(field);
                //只有包含查询匹配的字段才会突出显示
                highlightBuilder.requireFieldMatch(false);
            }
            searchSourceBuilder.highlighter(highlightBuilder);
        }
        log.debug(Constants.BUILDER, searchSourceBuilder);
        searchRequest.source(searchSourceBuilder);
        try {
            SearchResponse search = highLevelClient.search(searchRequest);
            SearchHits searchHits = search.getHits();
            long totalHit = searchHits.getTotalHits();
            SearchHit[] searchHitHits = searchHits.getHits();
            List<JSONObject> list = new ArrayList<>(searchHitHits.length);
            for (SearchHit hit : searchHitHits) {
                list.add(JSON.parseObject(hit.getSourceAsString()));
            }
            return this.buildPageInfo(list, totalHit, pageRequest.getPageNum(), pageRequest.getPageSize());
        } catch (IOException e) {
            log.error("queryPage error,cause:{}", e);
        }
        return null;
    }

    public <T> PageInfo<T> buildPageInfo(List<T> list, long total, Integer pageNum, Integer pageSize) {
        com.github.pagehelper.Page<T> gitPage = new com.github.pagehelper.Page<>();
        for (int i = 0; i < list.size(); i++) {
            gitPage.add(i, list.get(i));
        }
        gitPage.setTotal(total);
        BigDecimal totalDecimal = BigDecimal.valueOf(total);
        BigDecimal pageSizeDecimal = BigDecimal.valueOf((long) pageSize);
        int pages = totalDecimal.divide(pageSizeDecimal, BigDecimal.ROUND_FLOOR).intValue();
        gitPage.setPages(pages);
        gitPage.setPageNum(pageNum);
        gitPage.setPageSize(pageSize);
        gitPage.setStartRow((pageNum - 1) * pageSize);

        return new PageInfo<>(gitPage);
    }

    /**
     * 使用游标循环查询全部数据
     *
     * @param indexName
     * @param typeName
     * @param queryBuilder
     * @return
     */
    public List<SearchHit> queryAll(String indexName, String typeName, QueryBuilder queryBuilder) {
        SearchRequest searchRequest = new SearchRequest(indexName);
        searchRequest.types(typeName);
        Long beginTime = System.currentTimeMillis();
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().size(MAX_DATA_SIZE);
        searchSourceBuilder.query(queryBuilder);
        searchRequest.source(searchSourceBuilder);
        List<SearchHit> resultSearchHit = new ArrayList<>();
        try {
            SearchResponse searchResponse = highLevelClient.search(searchRequest);
            Scroll scroll = new Scroll(timeValueMillis(5000));
            searchRequest.scroll(scroll);
            String scrollId = searchResponse.getScrollId();
            SearchHit[] hits = searchResponse.getHits().getHits();
            while (ArrayUtils.isNotEmpty(hits)) {
                for (SearchHit hit : hits) {
                    resultSearchHit.add(hit);
                }
                SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId);
                searchScrollRequest.scroll(scroll);
                SearchResponse searchScrollResponse = highLevelClient.searchScroll(searchScrollRequest);
                scrollId = searchScrollResponse.getScrollId();
                hits = searchScrollResponse.getHits().getHits();
            }
            //及时清除es快照,释放资源
            ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
            clearScrollRequest.addScrollId(scrollId);
            highLevelClient.clearScroll(clearScrollRequest);
        } catch (IOException e) {
            log.error("queryAll error,cause:{}", e);
        }
        Long runTime = System.currentTimeMillis() - beginTime;
        log.debug("查询时间:{}", runTime);
        return resultSearchHit;
    }

    /**
     * 查询数量
     *
     * @param indexName
     * @param typeName
     * @param queryBuilder
     * @return
     */
    public Long selectCount(String indexName, String typeName, QueryBuilder queryBuilder) {
        SearchRequest searchRequest = new SearchRequest(indexName);
        searchRequest.types(typeName);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(queryBuilder);
        searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        //不需要 source
        searchSourceBuilder.fetchSource(false);
        searchRequest.source(searchSourceBuilder);
        try {
            SearchResponse search = highLevelClient.search(searchRequest);
            return search.getHits().getTotalHits();
        } catch (Exception e) {
            log.error(Constants.COUNT_ERROR, e);
        }
        return 0L;
    }

    /**
     * 聚合查询-返回统计数值
     *
     * @param indexName          索引
     * @param typeName           文档类型
     * @param aggName            聚合名称
     * @param queryBuilder       查询条件
     * @param aggregationBuilder 聚合条件
     * @return 统计值
     */
    public Long selectCount(String indexName, String typeName, String aggName, QueryBuilder queryBuilder, AggregationBuilder aggregationBuilder) {
        SearchRequest searchRequest = new SearchRequest(indexName);
        searchRequest.types(typeName);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.size(0);
        searchSourceBuilder.query(queryBuilder);
        // 聚合条件
        searchSourceBuilder.aggregation(aggregationBuilder);
        searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        searchSourceBuilder.fetchSource(false);
        searchRequest.source(searchSourceBuilder);
        try {
            SearchResponse search = highLevelClient.search(searchRequest);
            Aggregations aggregations = search.getAggregations();
            // 根据聚合名称获取统计值
            Cardinality cardinality = aggregations.get(aggName);
            return cardinality.getValue();
        } catch (Exception e) {
            log.error("select distinct count error cause: {0}", e);
        }
        return 0L;
    }

    /**
     * 聚合查询-返回分类统计的值
     *
     * @param indexName          索引
     * @param typeName           文档类型
     * @param aggregationBuilder 聚合条件
     * @return 分类统计结果
     */
    public SearchResponse selectCount(String indexName, String typeName, AggregationBuilder aggregationBuilder) {
        SearchRequest searchRequest = new SearchRequest(indexName);
        searchRequest.types(typeName);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.size(0);
        searchSourceBuilder.aggregation(aggregationBuilder);
        searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        searchSourceBuilder.fetchSource(false);
        log.debug(Constants.BUILDER, searchSourceBuilder);
        searchRequest.source(searchSourceBuilder);
        try {
            return highLevelClient.search(searchRequest);
        } catch (IOException e) {
            log.error("select aggregate count error cause: {0}", e);
        }
        return null;
    }

    /**
     * 插入文档
     *
     * @param indexName
     * @param typeName
     * @param idColumn
     * @param dataObj
     * @return
     */
    public boolean putData(String indexName, String typeName, String idColumn, JSONObject dataObj) {
        String method = "PUT";
        String endpoint = "/" + indexName + "/" + typeName + "/" + idColumn;
        return performRequest(method, endpoint, dataObj.toJSONString());
    }

    /**
     * 批量插入文档
     *
     * @param indexName
     * @param typeName
     * @param idColumn
     * @param datas
     * @return
     */
    public boolean putDataBulk(String indexName, String typeName, String idColumn, List<JSONObject> datas) {
        BulkRequest request = new BulkRequest();
        datas.forEach(data -> request.add(new IndexRequest(indexName, typeName, String.valueOf(data.get(idColumn))).source(data, XContentType.JSON)));
        try {
            BulkResponse bulkResponse = highLevelClient.bulk(request);
            log.debug("putDataBulk:{}", bulkResponse);
            return !bulkResponse.hasFailures();
        } catch (IOException e) {
            log.error(Constants.COUNT_ERROR, e);
        }
        return false;
    }

    /**
     * 条件查询
     *
     * @param indexName
     * @param typeName
     * @param query
     * @return
     */
    public boolean queryByQuery(String indexName, String typeName, String query) {
        String method = "POST";
        String endpoint = "/" + indexName + "/" + typeName + "/_search";
        return performRequest(method, endpoint, query);
    }

    /**
     * 条件删除
     *
     * @param indexName
     * @param typeName
     * @param query
     * @return
     */
    public boolean deleteByQuery(String indexName, String typeName, String query) {
        String method = "POST";
        String endpoint = "/" + indexName + "/" + typeName + "/_delete_by_query";
        return performRequest(method, endpoint, query);
    }

    /**
     * 条件更新
     *
     * @param indexName
     * @param typeName
     * @param query
     * @return
     */
    public boolean updateByQuery(String indexName, String typeName, String query) {
        String method = "POST";
        String endpoint = "/" + indexName + "/" + typeName + "/_update_by_query?conflicts=proceed";
        return performRequest(method, endpoint, query);
    }
}

7.10.2版本

@Slf4j
@Component
public class RestClientService {

    /**
     * ES最大数据限制
     */
    public static final int MAX_DATA_SIZE = 100;
    @Autowired
    private RestHighLevelClient client;

    /********************************************创建mapping********************************************/
    /**
     * 加载文件内容
     *
     * @param path
     * @return
     */
    public String loadText(String path) {
        String textData = null;
        try {
            ClassPathResource classPathResource = new ClassPathResource(path);
            try (InputStream inputStream = classPathResource.getInputStream()) {
                textData = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
            }
        } catch (Exception e) {
            log.error("load mappping file error, cause {0}", e);
        }
        return textData;
    }

    /**
     * 创建mapping映射
     *
     * @param index
     * @param path
     * @return
     */
    public boolean createIndexMapping(String index, String path) {
        PutMappingRequest request = new PutMappingRequest(index);
        request.source(loadText(path), XContentType.JSON);
        try {
            AcknowledgedResponse response = client.indices().putMapping(request, RequestOptions.DEFAULT);
            return response.isAcknowledged();
        } catch (IOException e) {
            log.error("create index mapping error, cause {0}", e);
        }
        return false;
    }

    /********************************************索引(创建,删除,存在)********************************************/
    /**
     * 创建索引,若索引不存在且创建成功,返回true,若同名索引已存在,返回false
     *
     * @param index 索引名称
     * @return
     */
    public boolean createIndex(String index) {
        //创建索引请求
        CreateIndexRequest request = new CreateIndexRequest(index);
        //执行创建请求IndicesClient,请求后获得响应
        try {
            CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
            return response.isAcknowledged();
        } catch (Exception e) {
            log.error("create index error, cause {0}", e);
        }
        return false;
    }

    /**
     * 删除索引,删除成功返回true,删除失败返回false
     *
     * @param index 索引名称
     * @return true/false
     */
    public boolean deleteIndex(String index) {
        if (!existsIndex(index)) {
            log.debug("deleteIndex error, cause: {} not exists", index);
            return false;
        }
        DeleteIndexRequest request = new DeleteIndexRequest(index);
        try {
            AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
            return response.isAcknowledged();
        } catch (Exception e) {
            log.error("delete index error, cause {0}", e);
        }
        return false;
    }


    /**
     * 判断索引是否存在,若存在返回true,若不存在或出现问题返回false
     *
     * @param index 索引名称
     * @return
     */
    public boolean existsIndex(String index) {
        GetIndexRequest request = new GetIndexRequest(index);
        try {
            return client.indices().exists(request, RequestOptions.DEFAULT);
        } catch (Exception e) {
            log.error("existsIndex error, cause {0}", e);
        }
        return false;
    }

    /********************************************文档(创建,更新,删除,存在)********************************************/
    /**
     * 新增/修改文档信息
     *
     * @param index 索引名称
     * @param id    文档id
     * @param data  数据
     * @return
     */
    public boolean putData(String index, String id, JSONObject data) {
        try {
            IndexRequest request = new IndexRequest(index);
            if (id != null && id.length() > 0) {
                request.id(id);
            }
            request.source(JSON.toJSONString(data), XContentType.JSON);
            IndexResponse response = client.index(request, RequestOptions.DEFAULT);
            String status = response.status().toString();
            if ("CREATED".equals(status) || "OK".equals(status)) {
                return true;
            }
        } catch (Exception e) {
            log.error("put data error, cause {0}", e);
        }
        return false;
    }


    /**
     * 批量插入文档
     *
     * @param index 索引名称
     * @param datas 数据的集合
     * @return
     */
    public boolean putDataBulk(String index, List<JSONObject> datas) {
        try {
            BulkRequest bulkRequest = new BulkRequest();
            if (!CollectionUtils.isEmpty(datas)) {
                for (Object obj : datas) {
                    bulkRequest.add(new IndexRequest(index).source(JSON.toJSONString(obj), XContentType.JSON));
                }
                BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);
                log.debug("putDataBulk:{}", response);
                if (!response.hasFailures()) {
                    return true;
                }
            }
        } catch (Exception e) {
            log.error("put data bulk error, cause {0}", e);
        }
        return false;
    }

    /**
     * 更新文档
     *
     * @param index 索引名称
     * @param id    文档id
     * @param data  数据
     * @return
     */
    public boolean updateData(String index, String id, JSONObject data) {
        try {
            UpdateRequest request = new UpdateRequest(index, id);
            request.doc(JSON.toJSONString(data), XContentType.JSON);
            UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
            String status = response.status().toString();
            if ("OK".equals(status)) {
                return true;
            }
        } catch (Exception e) {
            log.error("update data error, cause {0}", e);
        }
        return false;
    }

    /**
     * 删除文档
     *
     * @param index 索引名称
     * @param id    文档id
     * @return
     */
    public boolean deleteData(String index, String id) {
        try {
            DeleteRequest request = new DeleteRequest(index, id);
            DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
            String status = response.status().toString();
            if ("OK".equals(status)) {
                return true;
            }
        } catch (Exception e) {
            log.error("delete data error, cause {0}", e);
        }
        return false;
    }

    /**
     * 批量删除文档
     *
     * @param index 索引名称
     * @param ids   文档id的集合
     * @return
     */
    public boolean deleteDataBulk(String index, List<String> ids) {
        BulkRequest request = new BulkRequest();
        for (String id : ids) {
            request.add(new DeleteRequest().index(index).id(id));
        }
        try {
            BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
            return !response.hasFailures();
        } catch (Exception e) {
            log.error("delete data bulk error, cause {0}", e);
        }
        return false;
    }

    /**
     * 条件删除
     *
     * @param index        索引名称
     * @param queryBuilder 删除条件
     * @return
     */
    public boolean deleteByQuery(String index, QueryBuilder queryBuilder) {
        DeleteByQueryRequest request = new DeleteByQueryRequest(index);
        request.setRefresh(true);
        request.setQuery(queryBuilder);
        try {
            BulkByScrollResponse response = client.deleteByQuery(request, RequestOptions.DEFAULT);
            return response.getStatus().getDeleted() > 0;
        } catch (IOException e) {
            log.error("delete by query error, cause {0}", e);
        }
        return false;
    }

    /**
     * 条件更新
     *
     * @param index        索引名称
     * @param queryBuilder 更新条件
     * @return
     */
    public boolean updateByQuery(String index, QueryBuilder queryBuilder, String script) {
        UpdateByQueryRequest request = new UpdateByQueryRequest(index);
        request.setConflicts("proceed");
        request.setQuery(queryBuilder);
        request.setScript(new Script(ScriptType.INLINE, "painless", script, Collections.emptyMap()));
        try {
            BulkByScrollResponse response = client.updateByQuery(request, RequestOptions.DEFAULT);
            return response.getStatus().getUpdated() > 0;
        } catch (IOException e) {
            log.error("update by query error, cause {0}", e);
        }
        return false;
    }

    /**
     * 判断文档是否存在
     *
     * @param index 索引名称
     * @param id    文档id
     * @return
     */
    public boolean existsData(String index, String id) {
        GetRequest request = new GetRequest(index, id);
        try {
            GetResponse response = client.get(request, RequestOptions.DEFAULT);
            return response.isExists();
        } catch (Exception e) {
            log.error("existsData error, cause {0}", e);
        }
        return false;
    }

    /********************************************文档(查询)********************************************/
    /**
     * 条件查询
     *
     * @param index              索引名称
     * @param queryBuilder       查询条件
     * @param aggregationBuilder 聚合条件
     * @return
     */
    public SearchResponse query(String index, QueryBuilder queryBuilder, AggregationBuilder aggregationBuilder) {
        SearchRequest searchRequest = new SearchRequest(index);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.trackTotalHits(true);
        searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        // 查询条件
        if (queryBuilder != null) {
            searchSourceBuilder.query(queryBuilder);
        }
        // 聚合条件
        if (aggregationBuilder != null) {
            searchSourceBuilder.aggregation(aggregationBuilder);
        }
        searchRequest.source(searchSourceBuilder);
        try {
            return client.search(searchRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            log.error("select distinct count error cause: {0}", e);
        }
        return null;
    }

    /**
     * 查询数量
     *
     * @param index        索引名称
     * @param queryBuilder 查询条件
     * @return
     */
    public Long selectCount(String index, QueryBuilder queryBuilder) {
        SearchResponse response = query(index, queryBuilder, null);
        if (response == null) {
            return 0L;
        }
        return response.getHits().getTotalHits().value;

    }

    /**
     * 聚合查询-返回统计数值
     *
     * @param index              索引名称
     * @param aggName            聚合名称
     * @param queryBuilder       查询条件
     * @param aggregationBuilder 聚合条件
     * @return 统计值
     */
    public Long selectCount(String index, String aggName, QueryBuilder queryBuilder, AggregationBuilder aggregationBuilder) {
        SearchResponse response = query(index, queryBuilder, aggregationBuilder);
        if (response == null) {
            return 0L;
        }
        Aggregations aggregations = response.getAggregations();
        // 根据聚合名称获取统计值
        Cardinality cardinality = aggregations.get(aggName);
        return cardinality.getValue();
    }

    /**
     * 分页查询
     *
     * @param index             索引名称
     * @param queryBuilder      查询条件
     * @param pageRequest       分页条件
     * @param highlightFieldSet 高亮
     * @param isCollapse        去重
     * @return
     */
    public PageInfo<JSONObject> queryPage(String index, QueryBuilder queryBuilder, BasePageRequest pageRequest, Set<String> highlightFieldSet, boolean isCollapse) {
        SearchRequest request = new SearchRequest(index);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        // 超出ES最大数据限制,则返回最后一页
        if (pageRequest.getOffsetNum() + pageRequest.getPageSize() > MAX_DATA_SIZE) {
            BigDecimal totalDecimal = BigDecimal.valueOf(MAX_DATA_SIZE);
            BigDecimal pageSizeDecimal = BigDecimal.valueOf((long) pageRequest.getPageSize());
            int pages = totalDecimal.divide(pageSizeDecimal, BigDecimal.ROUND_FLOOR).intValue();
            pageRequest.setPageNum(pages);
        }
        // 条件查询
        searchSourceBuilder.query(queryBuilder);
        // 对任务进行去重
        if (isCollapse) {
            searchSourceBuilder.collapse(new CollapseBuilder("taskId.keyword"));
        }
        // 分页
        if (Boolean.TRUE.equals(pageRequest.getDoPage())) {
            searchSourceBuilder.from(pageRequest.getOffsetNum());
            searchSourceBuilder.size(pageRequest.getPageSize());
        }
        // 排序
        if (Boolean.TRUE.equals(pageRequest.getDoSort())) {
            if (StringUtils.isBlank(pageRequest.getSortColumn())) {
                throw new ZnbkException("当前方法已启用排序,但未指定排序字段[sortColumn]");
            }
            searchSourceBuilder.sort(pageRequest.getSortColumn(), SortOrder.fromString(pageRequest.getSortRule()));
        }
        // 设置高亮显示字段
        if (highlightFieldSet != null && !highlightFieldSet.isEmpty()) {
            HighlightBuilder highlightBuilder = new HighlightBuilder();
            for (String highlightField : highlightFieldSet) {
                HighlightBuilder.Field field = new HighlightBuilder.Field(highlightField);
                //.preTags("<em class=\"highlight\" style=\"color:red;\">").postTags("</em>")
                // 高亮字段
                highlightBuilder.field(field);
                //只有包含查询匹配的字段才会突出显示
                highlightBuilder.requireFieldMatch(false);
            }
            searchSourceBuilder.highlighter(highlightBuilder);
        }
        log.debug(Constants.BUILDER, searchSourceBuilder);
        request.source(searchSourceBuilder);
        try {
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            SearchHits searchHits = response.getHits();
            long totalHit = searchHits.getTotalHits().value;
            SearchHit[] searchHitHits = searchHits.getHits();
            List<JSONObject> list = new ArrayList<>(searchHitHits.length);
            for (SearchHit hit : searchHitHits) {
                list.add(JSON.parseObject(hit.getSourceAsString()));
            }
            return this.buildPageInfo(list, totalHit, pageRequest.getPageNum(), pageRequest.getPageSize());
        } catch (IOException e) {
            log.error("queryPage error,cause:{}", e);
        }
        return null;
    }

    /**
     * 封装分页数据
     *
     * @param list     查询结果
     * @param total    总条数
     * @param pageNum  页数
     * @param pageSize 条数
     * @param <T>
     * @return
     */
    public <T> PageInfo<T> buildPageInfo(List<T> list, long total, Integer pageNum, Integer pageSize) {
        com.github.pagehelper.Page<T> gitPage = new com.github.pagehelper.Page<>();
        for (int i = 0; i < list.size(); i++) {
            gitPage.add(i, list.get(i));
        }
        gitPage.setTotal(total);
        BigDecimal totalDecimal = BigDecimal.valueOf(total);
        BigDecimal pageSizeDecimal = BigDecimal.valueOf((long) pageSize);
        int pages = totalDecimal.divide(pageSizeDecimal, BigDecimal.ROUND_FLOOR).intValue();
        gitPage.setPages(pages);
        gitPage.setPageNum(pageNum);
        gitPage.setPageSize(pageSize);
        gitPage.setStartRow((pageNum - 1) * pageSize);

        return new PageInfo<>(gitPage);
    }

    /**
     * 使用游标循环查询全部数据
     *
     * @param index        索引名称
     * @param queryBuilder 查询条件
     * @return
     */
    public List<SearchHit> queryAll(String index, QueryBuilder queryBuilder) {
        Long beginTime = System.currentTimeMillis();
        SearchRequest request = new SearchRequest(index);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        Scroll scroll = new Scroll(timeValueMillis(5000));
        searchSourceBuilder.size(MAX_DATA_SIZE);
        searchSourceBuilder.query(queryBuilder);
        request.source(searchSourceBuilder);
        request.scroll(scroll);
        List<SearchHit> resultSearchHit = new ArrayList<>();
        try {
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            String scrollId = response.getScrollId();
            SearchHit[] hits = response.getHits().getHits();
            while (ArrayUtils.isNotEmpty(hits)) {
                for (SearchHit hit : hits) {
                    resultSearchHit.add(hit);
                }
                SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
                scrollRequest.scroll(scroll);
                SearchResponse searchResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);
                scrollId = searchResponse.getScrollId();
                hits = searchResponse.getHits().getHits();
            }
            if (scrollId != null) {
                //及时清除es快照,释放资源
                ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
                clearScrollRequest.addScrollId(scrollId);
                client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
            }
        } catch (IOException e) {
            log.error("queryAll error,cause:{}", e);
        }
        Long runTime = System.currentTimeMillis() - beginTime;
        log.debug("查询时间:{}", runTime);
        return resultSearchHit;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值