使用elasticsearch首先创建索引
命令行创建的方法:
curl -XPUT 127.0.0.1:9200/ikblockchain?pretty -d '{"mappings":{"server_log":{"properties":{"addTime":{"type":"date","format":"yyyy-MM-dd HH:mm:ss"},"appName":{"type":"text"},"blockHeight":{"type":"long"},"cropId":{"type":"text"},"filePath":{"type":"text","analyzer":"whitespace"},"message":{"type":"keyword"},"rawContent":{"type":"text","analyzer":"whitespace"},"rawJsonContent":{"type":"text"},"timestamp":{"type":"long"},"toolType":{"type":"text"},"transactionId":{"type":"long"}}}}}' -H "Content-Type: application/json"
这个命令注意:后边 -H “Content-Type: application/json” 很重要,不然会报错
通过postman创建
图中server_log是封装对象的表名
package com.dbapp.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.io.Serializable;
import java.util.Date;
/**
* es
*/
@Document(indexName = "自定义的索引名称", type = "server_log", shards = 1, replicas = 0, refreshInterval = "-1")
public class ServerLog implements Serializable {
private static final long serialVersionUID = -3526322457890471922L;
@Id
private String id;
/**
* 这里的type 可以使text和keyword,区别是在查询是text自动分词,keyword不分词
*/
@Field(type = FieldType.Keyword)
private String message;
/**
* 注意带上timezone="GMT+8",否则es搜索时间区间时会因为时区问题跟预期不一样,es默认utc,需要转成GMT
*/
@Field(type = FieldType.Date, format = DateFormat.custom , pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date addTime;
private Long timestamp;
private Integer blockHeight;
private Integer transactionId;
@Field(type = FieldType.Text)
private String cropId;
public String getCropId() {
return cropId;
}
public void setCropId(String cropId) {
this.cropId = cropId;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Date getAddTime() {
return addTime;
}
public void setAddTime(Date addTime) {
this.addTime = addTime;
}
public Integer getBlockHeight() {
return blockHeight;
}
public void setBlockHeight(Integer blockHeight) {
this.blockHeight = blockHeight;
}
public Integer getTransactionId() {
return transactionId;
}
public void setTransactionId(Integer transactionId) {
this.transactionId = transactionId;
}
public Long getTimestamp() {
return timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
条件查询
@Override
public Page<ServerLog> getLogPageList(Map param, Integer pageNumber, Integer pageSize) {
if(param == null){
param = new HashMap();
}
Pageable pageable = PageRequest.of(pageNumber, pageSize);
Page<ServerLog> logPage;
QueryBuilder queryBuilder = QueryBuilders.boolQuery();
Date begin = (Date) param.get("begin");
Date end = (Date) param.get("end");
if (begin !=null){
((BoolQueryBuilder) queryBuilder).must(QueryBuilders.rangeQuery("addTime").gte(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(begin)));
}
if (end !=null){
((BoolQueryBuilder) queryBuilder).must(QueryBuilders.rangeQuery("addTime").lte(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(end)));
}
if(!StringUtils.isBlank((String)param.get("cropId"))){
((BoolQueryBuilder) queryBuilder).must(QueryBuilders.matchQuery("cropId",param.get("cropId")));
}
if(!StringUtils.isBlank((String)param.get("keyword"))){
mutilQuery((BoolQueryBuilder)queryBuilder,(String)param.get("keyword"));
}
SortBuilder sortBuilder= SortBuilders.fieldSort("addTime").order(SortOrder.DESC);
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
builder.withQuery(queryBuilder);
builder.withPageable(pageable);
builder.withSort(sortBuilder);
SearchQuery searchQuery = builder.build();
logPage = serverLogRepository.search(searchQuery);
return logPage;
}
@Override
public Iterable<ServerLog> getLogList(Map param) {
if(param == null){
param = new HashMap();
}
QueryBuilder queryBuilder = QueryBuilders.boolQuery();
Date begin = (Date) param.get("begin");
Date end = (Date) param.get("end");
if (begin !=null){
((BoolQueryBuilder) queryBuilder).must(QueryBuilders.rangeQuery("addTime").gte(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(begin)));
}
if (end !=null){
((BoolQueryBuilder) queryBuilder).must(QueryBuilders.rangeQuery("addTime").lte(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(end)));
}
if(!StringUtils.isBlank((String)param.get("cropId"))){
((BoolQueryBuilder) queryBuilder).must(QueryBuilders.matchQuery("cropId",param.get("cropId")));
}
if(!StringUtils.isBlank((String)param.get("keyword"))){
mutilQuery((BoolQueryBuilder)queryBuilder,(String)param.get("keyword"));
}
return serverLogRepository.search(queryBuilder);
}
private void mutilQuery(BoolQueryBuilder queryBuilder,String content){
QueryBuilder keyQueryBuilder = QueryBuilders.boolQuery();
String keyword="*"+content.toLowerCase()+"*";
((BoolQueryBuilder) keyQueryBuilder).should(QueryBuilders.wildcardQuery("cropId",keyword));
((BoolQueryBuilder) keyQueryBuilder).should(QueryBuilders.wildcardQuery("message",keyword));
//在使用wildcard模糊查询的时候如果不想对字段内容进行分词查询的话可以将内容变成keyword模式去查询,这样我们进行查询的时候就不会进行分词查询了
//((BoolQueryBuilder) keyQueryBuilder).should(QueryBuilders.wildcardQuery("message.keyword",keyword))
if(StringUtils.isNumeric(content)){
((BoolQueryBuilder) keyQueryBuilder).should(QueryBuilders.termQuery("blockHeight",content));
((BoolQueryBuilder) keyQueryBuilder).should(QueryBuilders.termQuery("transactionId",content));
}
(queryBuilder).must(keyQueryBuilder);
}
package com.dbapp.repository;
import com.dbapp.entity.ServerLog;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
/**
*/
@Repository
public interface ServerLogRepository extends ElasticsearchRepository<ServerLog, String> {
/**
* 根据CropId查询
*
* @param cropId
* @param pageable
* @return
*/
abstract Page<ServerLog> findByCropId(String cropId, Pageable pageable);
/**
* 查询指定CropId下的总数
*
* @param cropId
* @return
*/
abstract long countByCropId(String cropId);
void deleteByTimestampLessThanEqual(long time);
}