使用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);

}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐