springboot集成Elasticsearch,RestHighLevelClient方式实现基础crud

一、导入依赖

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>${elastic.client.version}</version>
</dependency>

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>${elastic.client.version}</version>
</dependency>

二、获取客户端(单例)

public static synchronized RestHighLevelClient getRestClient() {
        if (restClient == null) {
            String[] ips = elasticIps.split(" ");
            ArrayList<HttpHost> hostsArr = new ArrayList<>(ips.length);
            for (String ip : ips) {
                if (Strings.isNullOrEmpty(ip.trim())) {
                    continue;
                }
                HttpHost host = HttpHost.create(ip);
                hostsArr.add(host);
            }

            RestClientBuilder builder = RestClient.builder(
                    hostsArr.toArray(new HttpHost[0])
            ).setRequestConfigCallback(
                    requestConfigBuilder -> requestConfigBuilder
                            .setAuthenticationEnabled(true)
                            .setConnectTimeout(60000)
                            .setConnectionRequestTimeout(300000)
                            .setSocketTimeout(300000));

            if (authEnable) {
                final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
                credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
                builder.setHttpClientConfigCallback(httpClientBuilder ->
                        httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
            }

            restClient = new RestHighLevelClient(builder);

        }
        return restClient;
    }

三、创建索引和文档以及批量插入数据

(创建文档方式有点low,字段多了容易出错)

private void putData(List<BindAssetsDto> bindAssetsDtoList ){
        try {
            //判断索引是否已经存在
            GetIndexRequest existsRequest = new GetIndexRequest();
            existsRequest.indices(indexName);
            boolean isExist = restClient.indices().exists(existsRequest, RequestOptions.DEFAULT);
            if (!isExist){
                //创建索引
                Settings.Builder setting = Settings.builder().put("number_of_shards", "5").put("number_of_replicas", 1);
                XContentBuilder mappings = JsonXContent.contentBuilder().
                        startObject().
                        startObject("properties").
                        startObject("id").
                        field("type", "long").
                        endObject().
                        ...
                        endObject().
                        endObject();
                CreateIndexRequest request = new CreateIndexRequest(indexName).settings(setting).mapping(typeName, mappings);
                restClient.indices().create(request, RequestOptions.DEFAULT);
                LOGGER.info("创建索引: " + indexName + " 成功!");
            }
            BulkRequest bulkRequest = new BulkRequest();
            ObjectMapper objectMapper = new ObjectMapper();

            for (BindAssetsDto bindAssetsDto : bindAssetsDtoList) {
                bulkRequest.add(new IndexRequest(indexName, typeName).source(objectMapper.writeValueAsString(bindAssetsDto),XContentType.JSON));
            }
            restClient.bulk(bulkRequest,RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

四、批量删除数据

private void deleteData(List<Long> list) {
        DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest();
        deleteByQueryRequest.indices(indexName);
        TermsQueryBuilder builder = QueryBuilders.termsQuery("field", list);
        deleteByQueryRequest.setQuery(builder);
        deleteByQueryRequest.setConflicts("proceed");
        try {
            restClient.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

五、查询数据,使用BoolQueryBuilder方式

QueryBuilders.wildcardQuery():通配符方式模糊查询

QueryBuilders.termQuery():完全匹配(单个值,多个值用termsQuery())

must():and条件

public String search(Dto dto) {
        GetIndexRequest existsRequest = new GetIndexRequest();
        existsRequest.indices(indexName);
        try {
            boolean isExist = restClient.indices().exists(existsRequest, RequestOptions.DEFAULT);
            if (!isExist){
                return null;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        SearchRequest request = new SearchRequest();
        request.indices(indexName);

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().trackTotalHits(true);

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(QueryBuilders.wildcardQuery("path", dto.getdPath()+"*"));           
        if (StringUtils.isNotBlank(dto.getOrderBy())) {
            searchSourceBuilder.sort(dto.getOrderBy(), SortOrder.valueOf(dto.getSort()));
        }
        searchSourceBuilder.from(dto.getPageNum());
        searchSourceBuilder.size(dto.getPageSize());
        searchSourceBuilder.query(boolQueryBuilder);
        try {
            SearchResponse response = restClient.search(request, RequestOptions.DEFAULT);
            return response.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值