ES应用实战
es操作
·
ElasticSearch 在 B2C、C2C 项目中都有广泛的使用,尤其在追求响应速度的电商项目中尤其之多!比如商铺详情、SKU、SPU等等,都会存于ES中,方便检索,能极大提高项目的反应速度,给用户极好的体验!而在传统项目中也会有它的身影,比如项目接口的日志,操作日志等等,著名的就是ELK日志检索,能高效检索出某段时间的日志,因为它可以集群化,这样也提高了稳定性,存储方式不同于关系型数据库如 “mysql” 或者非关系型数据库 “nosql” ,redis等,可以存储海量的数据。近期因为需要使用对接口操作访问管理,做了这样一个小小需求!赶紧补上。
*重点 想了解ES是啥,可以我之前的文章
1、安装ES
这里为了方便我选用Windows版本,注意 最新版本,或者说8.0版本存在不稳定,或者不兼容,选择稳定版本更为稳妥,我这里选择的是7.62
解压压缩包,直接运行 解压前要确定有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 冲
更多推荐
已为社区贡献2条内容
所有评论(0)