ElasticSearch 在 B2C、C2C 项目中都有广泛的使用,尤其在追求响应速度的电商项目中尤其之多!比如商铺详情、SKU、SPU等等,都会存于ES中,方便检索,能极大提高项目的反应速度,给用户极好的体验!而在传统项目中也会有它的身影,比如项目接口的日志,操作日志等等,著名的就是ELK日志检索,能高效检索出某段时间的日志,因为它可以集群化,这样也提高了稳定性,存储方式不同于关系型数据库如 “mysql” 或者非关系型数据库 “nosql” ,redis等,可以存储海量的数据。近期因为需要使用对接口操作访问管理,做了这样一个小小需求!赶紧补上。

*重点 想了解ES是啥,可以我之前的文章

海量数据检索 - “ElasticSearch” 聪聪著

1、安装ES

这里为了方便我选用Windows版本,注意 最新版本,或者说8.0版本存在不稳定,或者不兼容,选择稳定版本更为稳妥,我这里选择的是7.62

ElasticSearch下载地址

解压压缩包,直接运行 解压前要确定有jdk,最好还是选择稳定版本1.8
在这里插入图片描述
success 【成功】
在这里插入图片描述

ES很占用内存,需要调整,8.0许多版本没有内存限制,电脑带不起来的,卡死的

在这里插入图片描述
配置文件 【jvm.options】
在这里插入图片描述

2、项目中使用

2.1 、添加依赖

       <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
			<version>2.3.2.RELEASE</version>
		</dependency>

2.2 yaml添加配置

 elasticsearch:
    rest:
      uris:
        - http://localhost:9200

以上配置OK啦,重点要来了 spring boot项目中使用

数据层面 Repository

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

/**
 * @author Mr Lcc
 * @date 2022/9/2 10:59
 */
@Repository
public interface IEsSysLogRepository extends ElasticsearchRepository<EsSysLog, String> {
}

实体交互层面 model

import cn.hutool.core.date.DatePattern;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

/**
 * @author Mr Lcc
 * @date 2022/9/2 11:00
 */
@Data
@Document(indexName = "eslog")
public class EsSysLog implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private String id;

    /**
     * 用户操作
     */
    private String operation;
    /**
     * 请求URI
     */
    private String requestUri;
    /**
     * 请求方式
     */
    private String requestMethod;
    /**
     * 请求参数
     */
    private String requestParams;
    /**
   ...
}

具体索引 API的方式有几类 【针对于实体类具体属性】

/**
 * @Field(type=FieldType.Text, analyzer=“ik_max_word”) 表示该字段是一个文本,并作最大程度拆分,默认建立索引
 *
 * @Field(type=FieldType.Text,index=false) 表示该字段是一个文本,不建立索引
 *
 * @Field(type=FieldType.Date) 表示该字段是一个文本,日期类型,默认不建立索引
 *
 * @Field(type=FieldType.Long) 表示该字段是一个长整型,默认建立索引
 *
 * @Field(type=FieldType.Keyword) 表示该字段内容是一个文本并作为一个整体不可分,默认建立索引
 *
 * @Field(type=FieldType.Float) 表示该字段内容是一个浮点类型并作为一个整体不可分,默认建立索引
 *
 * date 、float、long都是不能够被拆分
 */

具体操作 实现类中

import com.alibaba.fastjson.JSON;
import io.renren.modules.es.entity.EsSysLog;
import io.renren.modules.es.repository.IEsSysLogRepository;
import io.renren.modules.es.service.IEsSysLogService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author Mr Lcc
 * @date 2022/9/2 11:03
 */
@Slf4j
@AllArgsConstructor
@Service
public class IEsSysLogServiceImpl implements IEsSysLogService {

    private IEsSysLogRepository sysLogRepository;
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Async
    @Override
    public void saveSysLog(EsSysLog sysLogDTO) {
        sysLogDTO.setCreateTime(new Date());
        EsSysLog save = sysLogRepository.save(sysLogDTO);
        log.info("存入es的数据 {}", JSON.toJSONString(save));

    }

    @Override
    public List<EsSysLog> searchSysLogPage(Map<String, Object> params) {

        NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder().withMaxResults(1000);
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();

        if (!StringUtils.isEmpty(params.get("status"))) {
            queryBuilder.must(QueryBuilders.termQuery("status", Integer.parseInt(String.valueOf(params.get("status")))));
        }

        log.info("DSL:{}", builder.withQuery(queryBuilder).build().getQuery());
        List<EsSysLog> esSysLogs = elasticsearchRestTemplate.search(builder.withQuery(queryBuilder).build(), EsSysLog.class)
                .stream().map(SearchHit::getContent).collect(Collectors.toList());

        log.info("查出的数据日志问题数量:{}", esSysLogs.size());
        return esSysLogs;
    }
}

执行日志 DSL
在这里插入图片描述

demo很简陋,可自行调整

向阳而生 @lcc 冲

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐