springboot下集成spring-data-elasticsearch和RestHighLevelClient

1、添加依赖

  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            <version>2.1.17.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.8.13</version>
        </dependency>

2、配置文件

spring.elasticsearch.rest.uris = 10.53.10.88:9200
spring.elasticsearch.rest.username = fmapp
spring.elasticsearch.rest.password = 9usdW95nB0CK2mjs

3、代码

package com.freemud.unify.shops.manager;

import com.alibaba.fastjson.JSON;
import com.freemud.unify.shops.entity.ProductOperatorLog;
import com.freemud.unify.shops.entity.ProductOperatorLogQuery;
import com.freemud.unify.shops.entity.ProductOperatorLogResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchScrollRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;

@Slf4j
@Service
public class ProductOperatorLogManager {

    private static final String PRODUCT_OPERATOR_LOG_INDEX = "product-operator-log-";
    private static final String DEFAULT_TYPE = "_doc";

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    /**
     * 异步批量新增
     * @param List
     */
    public void bulkAsync(List<ProductOperatorLog> List){
        BulkRequest request = new BulkRequest();
        List.forEach(create->{
            LocalDateTime localDateTime = LocalDateTime.ofInstant(create.getCreateTime().toInstant()
                    , ZoneId.systemDefault());
            request.add(new IndexRequest().index(PRODUCT_OPERATOR_LOG_INDEX + localDateTime.getYear() + "-" +localDateTime.getMonthValue()).type(DEFAULT_TYPE)
                    .source(JSON.toJSONString(create), XContentType.JSON));
        });

        restHighLevelClient.bulkAsync(request, RequestOptions.DEFAULT,new ActionListener<BulkResponse>() {
            @Override
            public void onResponse(BulkResponse bulkResponse) {
                log.info("bulklistener_onResponse count:"+bulkResponse.getItems().length);
            }

            @Override
            public void onFailure(Exception e) {
                log.error("bulklistener_onFailure body{} e{}",request.requests(), ExceptionUtils.getFullStackTrace(e));
            }
        });
    }

    /**
     * 根据id删除数据
     */
    public void delete(){
        DeleteRequest request = new DeleteRequest();
        request.id("-bkcZowBWbbjdR2AHHsG");
        request.index("product-operator-log-2023-12");
        request.type(DEFAULT_TYPE);
        try {
            restHighLevelClient.delete(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 删除索引
     */
    public void deleteIndex(){
        DeleteIndexRequest request = new DeleteIndexRequest("product-operator-log-2023-12");
        try {
            restHighLevelClient.indices().delete(request,RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 根据条件查询
     *
     * @param queryDto
     * @return
     */
    public ProductOperatorLogResponse queryByConditions(ProductOperatorLogQuery queryDto) {
        ProductOperatorLogResponse operatorLogResponse = new ProductOperatorLogResponse();
        List<ProductOperatorLog> result = new ArrayList<>();

        SearchResponse response= queryElasticsearch(queryDto);

        if(response != null && response.getHits() != null){
            Iterator<SearchHit> hitIterator = response.getHits().iterator();
            while (hitIterator.hasNext()) {
                result.add(JSON.parseObject(hitIterator.next().getSourceAsString(), ProductOperatorLog.class));
            }
            operatorLogResponse.setScrollId(response.getScrollId());
            operatorLogResponse.setResult(result);
            operatorLogResponse.setTotalNum(response.getHits().getTotalHits());
        }

        return operatorLogResponse;
    }

    private SearchResponse queryElasticsearch(ProductOperatorLogQuery queryDto){

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        if (StringUtils.isNotBlank(queryDto.getPartnerId())) {
            boolQueryBuilder.must(QueryBuilders.termQuery("partnerId", queryDto.getPartnerId()));
        }
        if (StringUtils.isNotBlank(queryDto.getProductId())) {
            boolQueryBuilder.must(QueryBuilders.termQuery("productId", queryDto.getProductId()));
        }
        //如果skuId是text类,防止被分词查不出来,可以用skuId.keyword查询
        if (StringUtils.isNotBlank(queryDto.getSkuId())) {
            boolQueryBuilder.must(QueryBuilders.termQuery("skuId.keyword", queryDto.getSkuId()));
        }
        if(queryDto.getCreateStartTime() != null || queryDto.getCreateEndTime() != null){
            RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("createTime");
            if (queryDto.getCreateStartTime() != null) {
                rangeQueryBuilder.from(queryDto.getCreateStartTime().getTime());
            }
            if (queryDto.getCreateEndTime() != null) {
                rangeQueryBuilder.to(queryDto.getCreateEndTime().getTime());
            }
            boolQueryBuilder.must(rangeQueryBuilder);
        }
        //通配符查询,类似于like查询
        if (StringUtils.isNotBlank(queryDto.getProductName())) {
            boolQueryBuilder.must(QueryBuilders.wildcardQuery("productName", "*"+queryDto.getProductName()+"*"));
        }

        SearchRequest request = new SearchRequest(PRODUCT_OPERATOR_LOG_INDEX + "*");

        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        if(Objects.equals(queryDto.getType(),Boolean.TRUE)){
            request.scroll(TimeValue.timeValueSeconds(120));
        }else{
            //检索超过10000 ES会报错,这里只返回数量
            if (queryDto.getPageNum() * queryDto.getPageSize() > 10000) {
                queryDto.setPageNum(1);
                queryDto.setPageSize(0);
            }
            sourceBuilder.from((queryDto.getPageNum() - 1) * queryDto.getPageSize());
        }
        sourceBuilder.sort("createTime", SortOrder.DESC);
        sourceBuilder.size(queryDto.getPageSize());

        request.source(sourceBuilder.query(boolQueryBuilder));
        SearchResponse response=null;
        try {
            response = restHighLevelClient.search(request,RequestOptions.DEFAULT);
        } catch (Exception e) {
            log.error("查询es异常 request{} e{}",queryDto, ExceptionUtils.getFullStackTrace(e));
        }
        return response;
    }

    /**
     * 滚动查询
     * @param scrollId
     * @return
     */
    public SearchResponse scrollSearch(String scrollId) {
        SearchResponse response=null;
        SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
        scrollRequest.scroll(TimeValue.timeValueSeconds(120));
        try {
            response = restHighLevelClient.scroll(scrollRequest,RequestOptions.DEFAULT);
        } catch (Exception e) {
            log.error("查询es异常 request{} e{}",scrollId, ExceptionUtils.getFullStackTrace(e));
        }
        return response;
    }
}

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Spring Boot集成带有用户名密码的Elasticsearch 6.3.2版本,你可以按照以下步骤进行操作: 1. 首先,将Elasticsearch 6.3.2版本的依赖项添加到你的Spring Boot项目的pom.xml文件中: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> ``` 2. 在application.properties(或application.yml)文件中配置Elasticsearch连接属性和身份验证信息。示例配置如下: ```properties spring.data.elasticsearch.cluster-nodes=localhost:9300 spring.data.elasticsearch.cluster-name=my-cluster spring.data.elasticsearch.properties.transport.tcp.port=9300 spring.data.elasticsearch.properties.transport.tcp.compress=true spring.data.elasticsearch.properties.transport.tcp.connect_timeout=5s spring.data.elasticsearch.properties.transport.tcp.socket_timeout=5s spring.data.elasticsearch.properties.transport.tcp.keep_alive=true spring.data.elasticsearch.properties.transport.tcp.no_delay=true spring.data.elasticsearch.properties.transport.tcp.send_buffer_size=1mb spring.data.elasticsearch.properties.transport.tcp.receive_buffer_size=1mb spring.data.elasticsearch.properties.transport.tcp.keep_alive_interval=30s # 身份验证相关配置 spring.data.elasticsearch.properties.transport.tcp.username=my-username spring.data.elasticsearch.properties.transport.tcp.password=my-password ``` 3. 创建一个Elasticsearch配置类,用于创建Elasticsearch客户端的bean,并设置身份验证信息。示例代码如下: ```java import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; @Configuration @EnableElasticsearchRepositories(basePackages = "com.example.repository") public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { @Value("${spring.data.elasticsearch.cluster-nodes}") private String clusterNodes; @Value("${spring.data.elasticsearch.cluster-name}") private String clusterName; @Value("${spring.data.elasticsearch.properties.transport.tcp.username}") private String username; @Value("${spring.data.elasticsearch.properties.transport.tcp.password}") private String password; @Override public RestHighLevelClient elasticsearchClient() { final ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo(clusterNodes) .withBasicAuth(username, password) .build(); return RestClients.create(clientConfiguration).rest(); } } ``` 在上面的示例中,我们使用了`RestHighLevelClient`来创建一个Elasticsearch客户端,并设置了身份验证信息。 4. 创建一个Elasticsearch存储库接口,用于定义与Elasticsearch的交互操作。示例代码如下: ```java import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.stereotype.Repository; @Repository public interface MyElasticsearchRepository extends ElasticsearchRepository<YourEntity, String> { // 自定义查询方法 } ``` 请将`YourEntity`替换为你的实体类。 现在,你已经完成了Spring Boot与带有用户名密码的Elasticsearch 6.3.2版本的集成。你可以使用自动注入的Elasticsearch存储库接口来执行与Elasticsearch的数据交互操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值