Elasticsearch API 8.16.1

1. pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
    <groupId>co.elastic.clients</groupId>
    <artifactId>elasticsearch-java</artifactId>
    <version>8.16.1</version>
    <exclusions>
        <exclusion>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>8.16.1</version>
</dependency>
<dependency>
    <groupId>jakarta.json</groupId>
    <artifactId>jakarta.json-api</artifactId>
    <version>2.1.3</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.17.0</version>
</dependency>

2. application.yml

elasticsearch:
  hosts: 192.168.xx.xx
  port: 9200
  scheme: http
  username: elastic
  password: xxxxaaf546512

3. 配置类

import java.util.Arrays;

import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import lombok.extern.slf4j.Slf4j;

/**
 * Elasticsearch 配置
 * 
 * @author 
 * @date 2024/11/28 星期四
 * @since JDK 11
 */
@Slf4j
@Configuration
public class ElasticsearchConfig {
	@Value("${elasticsearch.hosts}")
	private String hosts;

	@Value("${elasticsearch.port}")
	private int port;

	@Value("${elasticsearch.scheme:http}")
	private String scheme;

	@Value("${elasticsearch.username}")
	private String userName;

	@Value("${elasticsearch.password}")
	private String password;

	@Bean
	public ElasticsearchClient esClient() {
		log.info("初始化 ElasticsearchClient 开始.");

		try {
			HttpHost[] httpHosts = Arrays.stream(hosts.split(",")).filter(StringUtils::isNotBlank)
					.map(e -> new HttpHost(e, port, scheme)).toArray(HttpHost[]::new);
			// 设置用户名和密码
			final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
			credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password));

			RestClient restClient = RestClient.builder(httpHosts).setHttpClientConfigCallback(
							httpAsyncClientBuilder -> httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider))
					.build();

			ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());

			ElasticsearchClient esClient = new ElasticsearchClient(transport);

			log.info("初始化 ElasticsearchClient 成功.");

			return esClient;
		} catch (Exception e) {
			log.error("初始化 ElasticsearchClient 失败:{}", e.getMessage(), e);
			return null;
		}
	}
}

4. 测试类

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.alibaba.fastjson.JSON;
import com.jeesite.common.io.IOUtils;
import com.jeesite.modules.SmsApplication;
import com.jeesite.modules.common.CommonMethods;
import com.jeesite.modules.common.Constants;
import com.jeesite.modules.sms.dao.ISmsSendRecordDao;
import com.jeesite.modules.sms.entity.SmsSendRecord;
import com.jeesite.modules.sms.entity.es.EsSmsSendRecord;
import com.jeesite.modules.sms.enums.StatusEnum;
import com.jeesite.modules.sms.vo.SmsSendRecordVo;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.SortOrder;
import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery;
import co.elastic.clients.elasticsearch._types.query_dsl.Query;
import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
import co.elastic.clients.elasticsearch.core.BulkRequest;
import co.elastic.clients.elasticsearch.core.BulkResponse;
import co.elastic.clients.elasticsearch.core.GetResponse;
import co.elastic.clients.elasticsearch.core.IndexResponse;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.bulk.BulkResponseItem;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.elasticsearch.core.search.HitsMetadata;
import co.elastic.clients.elasticsearch.core.search.TotalHits;
import co.elastic.clients.util.NamedValue;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SmsApplication.class)
public class TestElasticsearch {

	/*
	 * 参考:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/getting-started-java.html
	 */

	@Autowired
	private ElasticsearchClient esClient;

	/** 短信发送记录Dao */
	@Autowired
	private ISmsSendRecordDao smsSendRecordDao;

	@Before
	public void setUp() {
	}

	@Test
	public void createIndex() {
		try {
			esClient.indices().create(x -> x.index("test_index"));
			System.out.println("--- 创建索引成功 ---");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(esClient);
			esClient.shutdown();
		}
	}

	@Test
	public void insert() {
		try {
			// 短信发送记录
			SmsSendRecord record = new SmsSendRecord();
			record.setId(CommonMethods.getMeUUID());
			record.setSysCode("pms");
			record.setSysName("xx系统");
			record.setFunctions("合同管理");
			record.setPhone("15214587854");
			record.setSmsContent("【测试短信");
			record.setReqTime(System.currentTimeMillis());
			record.setSendTime(new Date());
			record.setSendStatus(1);
			record.setFailMsg("发送成功");
			record.setSmsCount((long) CommonMethods.calcSmsCount(record.getSmsContent(), record.getPhone()));
			record.setStatus(StatusEnum.NORMAL.getCode());
			record.setCreateDate(new Date());
			record.setUpdateDate(new Date());

			IndexResponse response = esClient.index(i -> i.index("test_index").id(record.getId()).document(record));

			System.out.println("--- 新增数据成功 ---");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(esClient);
			esClient.shutdown();
		}
	}

	@Test
	public void batchInsert() {
		try {
			// 短信发送记录
			SmsSendRecord record1 = new SmsSendRecord();
			record1.setId(CommonMethods.getMeUUID());
			record1.setSysCode("migrate");
			record1.setSysName("征地移民");
			record1.setFunctions("征地任务");
			record1.setPhone("13500112345");
			record1.setSmsContent("测试短信");
			record1.setReqTime(System.currentTimeMillis());
			record1.setSendTime(new Date());
			record1.setSendStatus(1);
			record1.setFailMsg("发送成功");
			record1.setSmsCount((long) CommonMethods.calcSmsCount(record1.getSmsContent(), record1.getPhone()));
			record1.setStatus(StatusEnum.NORMAL.getCode());
			record1.setCreateDate(new Date());
			record1.setUpdateDate(new Date());

			SmsSendRecord record2 = new SmsSendRecord();
			record2.setId(CommonMethods.getMeUUID());
			record2.setSysCode("largeScreen");
			record2.setSysName("xxx大屏");
			record2.setFunctions("进度");
			record2.setPhone("13500112345");
			record2.setSmsContent("测试短信");
			record2.setReqTime(System.currentTimeMillis());
			record2.setSendTime(new Date());
			record2.setSendStatus(1);
			record2.setFailMsg("发送成功");
			record2.setSmsCount((long) CommonMethods.calcSmsCount(record2.getSmsContent(), record2.getPhone()));
			record2.setStatus(StatusEnum.NORMAL.getCode());
			record2.setCreateDate(new Date());
			record2.setUpdateDate(new Date());

			BulkRequest request = BulkRequest.of(
					b -> b.index("test_index").operations(op -> op.index(i -> i.id(record1.getId()).document(record1)))
							.operations(op -> op.index(i -> i.id(record2.getId()).document(record2))));

			BulkResponse response = esClient.bulk(request);

			System.out.println("--- 批量新增数据成功 ---");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(esClient);
			esClient.shutdown();
		}
	}

    @Test
    public void queryTotalCount() {
        try {
            CountRequest request = CountRequest.of(x -> x.index("sms_send_record"));
            CountResponse response = esClient.count(request);
            System.out.println("总数量:" + response.count());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(esClient);
            esClient.shutdown();
        }
    }

	@Test
	public void getById() {
		try {
			// a3357195433a730d48de919d48a3c577a851  db3119c8fc6d330b4101a70a5e879243798a
			String id = "db3119c8fc6d330b4101a70a5e879243798a";

			GetResponse<EsSmsSendRecord> response = esClient.get(g -> g.index("sms_send_record").id(id), EsSmsSendRecord.class);

			if (!response.found()) {
				System.out.println("短信发送记录不存在");
				return;
			}
			EsSmsSendRecord record = response.source();

			System.out.println(JSON.toJSONString(record));
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(esClient);
			esClient.shutdown();
		}
	}

	@Test
	public void searchAll() {
		try {
			NamedValue<SortOrder> sort = new NamedValue<>("createDate", SortOrder.Desc);

			SearchResponse<SmsSendRecord> searchResp = esClient
					.search(s -> s.index("test_index")
								  .query(q -> q.matchAll(m -> m)) // 搜索全部
								  .sort(srt -> srt.field(fld -> fld.field("sendTime").order(SortOrder.Desc)))
							, SmsSendRecord.class);

			HitsMetadata<SmsSendRecord> hits = searchResp.hits();

			long totalCounnt = hits.total() == null ? 0 : hits.total().value();

			System.out.println("totalCounnt=" + totalCounnt);

			List<SmsSendRecord> list = new ArrayList<>();

			hits.hits().forEach(h -> {
				list.add(h.source());
			});
			System.out.println(JSON.toJSONString(list));
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(esClient);
			esClient.shutdown();
		}
	}

	@Test
	public void search() {
		try {
			SmsSendRecord params = new SmsSendRecord();
			params.setSysCode("guanyg");
			params.setSysName("管系");
			params.setFunctions("程审");
			params.setPhone("78288");
			// 发送状态(0:失败, 1:成功)
			params.setSendStatus(1);

			String createBeginDate = "2024-11-27";
			String createEndDate = "2024-11-28";

			Query query = this.generateQuery(params, createBeginDate, createEndDate);

			SearchResponse<EsSmsSendRecord> response = esClient
					.search(s -> s.index("sms_send_record")
							.query(q -> q.bool(b -> b.must(query)))
							.sort(srt -> srt.field(fld -> fld.field("sendTime").order(SortOrder.Desc)))
							, EsSmsSendRecord.class);

			TotalHits total = response.hits().total();
			long totalCount = total == null ? 0 : total.value();

			System.out.println("查询总数:" + totalCount);

			List<Hit<EsSmsSendRecord>> hits = response.hits().hits();

			List<EsSmsSendRecord> list = new ArrayList<>();

			hits.forEach(hit -> list.add(hit.source()));

			System.out.println(JSON.toJSONString(list));

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(esClient);
			esClient.shutdown();
		}
	}

	@Test
	public void page() {
		/* 分页查询 */
		try {
			int pageNo = 1;
			int pageSize = 2;
			int offset = (pageNo - 1) * pageSize;

			SmsSendRecord params = new SmsSendRecord();

			String createBeginDate = "";
			String createEndDate = "";

			Query query = this.generateQuery(params, createBeginDate, createEndDate);

			// 分页查询
			SearchResponse<SmsSendRecord> response = esClient.search(
					s -> s.index("sms_send_record")
						  .query(q -> q.bool(b -> b.must(query)))
						  .sort(srt -> srt.field(fld -> fld.field("sendTime").order(SortOrder.Desc)))
						  .from(offset).size(pageSize)
					, SmsSendRecord.class);

			TotalHits total = response.hits().total();
			long totalCount = total == null ? 0 : total.value();

			System.out.println("查询总数:" + totalCount);

			List<Hit<SmsSendRecord>> hits = response.hits().hits();

			List<SmsSendRecord> list = new ArrayList<>();

			hits.forEach(hit -> list.add(hit.source()));

			System.out.println(JSON.toJSONString(list));
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(esClient);
			esClient.shutdown();
		}
	}

	@Test
	public void pgToEs() {
		/* pg数据导入数据到es */
		try {
			long startTime = System.currentTimeMillis();

			SmsSendRecord params = new SmsSendRecord();

			Long totalCount = smsSendRecordDao.queryCount(params);
			totalCount = totalCount == null ? 0L : totalCount;

			if (totalCount == 0) {
				System.out.println("短信发送记录不存在");
				return;
			}
			int pageSize = 50;
			// 总页数
			int totalPage = (int) (totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1);

			log.info("pg数据导入数据到es-开始.总数据量:{}, 总页数:{}", totalCount, totalPage);

			esClient.indices().delete(x -> x.index("sms_send_record"));

			// 当前页
			int currentPage = 1;

			while (currentPage <= totalPage) {
				// 分页查询(pgsql)
				List<SmsSendRecordVo> list = smsSendRecordDao.page(params, pageSize, (currentPage - 1) * pageSize);

				if (CollectionUtils.isEmpty(list)) {
					break;
				}
				// 导入数据到es
				this.savePgDatasToEs(list);

				currentPage = currentPage + 1;
			}
			log.info("pg数据导入数据到es-成功.总数据量:{}, 总耗时 {} 毫秒", totalCount, System.currentTimeMillis() - startTime);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(esClient);
			esClient.shutdown();
		}
	}

	/**
	 * 组装查询条件
	 *
	 * @date 2024-11-28
	 * @param params    短信发送记录
	 * @param beginDate 查询开始日期(yyyy-MM-dd)
	 * @param endDate   查询截止日期(yyyy-MM-dd)
	 * @return Query
	 * @since JDK 11
	 * @author 
	 */
	private Query generateQuery(SmsSendRecord params, String beginDate, String endDate) {
		// 多查询条件 must 可不断添加条件
		BoolQuery.Builder builder = QueryBuilders.bool();

		if (StringUtils.isNotBlank(params.getSysCode())) {
			// 模糊查询(加 .keyword 才能支持多个中文字符)
			builder.must(m -> m.wildcard(ma -> ma.field("sysCode.keyword").wildcard("*" + params.getSysCode() + "*")));
		}
		if (StringUtils.isNotBlank(params.getSysName())) {
			// 模糊查询(加 .keyword 才能支持多个中文字符)
			builder.must(m -> m.wildcard(ma -> ma.field("sysName.keyword").wildcard("*" + params.getSysName() + "*")));
		}
		if (StringUtils.isNotBlank(params.getFunctions())) {
			// 模糊查询(加 .keyword 才能支持多个中文字符)
			builder.must(
					m -> m.wildcard(ma -> ma.field("functions.keyword").wildcard("*" + params.getFunctions() + "*")));
		}
		if (StringUtils.isNotBlank(params.getPhone())) {
			// 模糊查询(加 .keyword 才能支持多个中文字符)
			builder.must(m -> m.wildcard(ma -> ma.field("phone.keyword").wildcard("*" + params.getPhone() + "*")));
		}
		if (params.getSendStatus() != null) {
			builder.must(m -> m.match(ma -> ma.field("sendStatus").query(params.getSendStatus())));
		}
		if (StringUtils.isNotBlank(beginDate)) {
			/* 查询开日期 */
			if (beginDate.length() == 10) {
				beginDate = beginDate.trim() + " 00:00:00";
			}
			/* Date 类型的字段,在 Elasticsearch 中的值是时间戳(如:1731198377322),故查询条件也需要转换成时间戳 */
			long time = 0;

			try {
				time = DateUtil.parseDate(beginDate, "yyyy-MM-dd HH:mm:ss").getTime();
			} catch (Exception e) {
			}
			final long lt = time;
			builder.must(m -> m.range(ma -> ma.number(r -> r.field("createDate").gte(Long.valueOf(lt).doubleValue()))));
		}
		if (StringUtils.isNotBlank(endDate)) {
			/* 查询截止期 */
			if (endDate.length() == 10) {
				endDate = endDate.trim() + " 23:59:59";
			}
			/* Date 类型的字段,在 Elasticsearch 中的值是时间戳(如:1731198377322),故查询条件也需要转换成时间戳 */
			long time = 0;

			try {
				time = DateUtil.parseDate(endDate, "yyyy-MM-dd HH:mm:ss").getTime();
			} catch (Exception e) {
			}
			final long lt = time;

			builder.must(m -> m.range(ma -> ma.number(r -> r.field("createDate").lte(Long.valueOf(lt).doubleValue()))));
		}
		builder.must(m -> m.match(ma -> ma.field("status").query(StatusEnum.NORMAL.getCode())));

		return builder.build()._toQuery();
	}

	/**
	 * pg数据导入数据到es
	 *
	 * @date 2024-11-29
	 * @param list pg数据
	 * @since JDK 11
	 * @author 
	 */
	private void savePgDatasToEs(List<SmsSendRecordVo> list) throws Exception {
		/* 参考:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/indexing-bulk.html */
		if (CollectionUtils.isEmpty(list)) {
			return;
		}
		BulkRequest.Builder builder = new BulkRequest.Builder();

		for (SmsSendRecordVo recd : list) {
			EsSmsSendRecord esRecord = JsonUtils.parse(JsonUtils.toJSONBytes(recd), EsSmsSendRecord.class);

			builder.operations(op -> op
					.index(idx -> idx
							.index("sms_send_record")
							.id(esRecord.getId())
							.document(esRecord)
					)
			);
		}
		BulkResponse response = esClient.bulk(builder.build());

		if (response.errors()) {
			/* 错误 */
			for (BulkResponseItem item: response.items()) {
				if (item.error() != null) {
					log.error("pg数据导入数据到es-失败:{}", item.error().reason());
				}
			}
		}
	}
}

5. JsonUtils

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.SerializerFeature;

/**
 * @author 
 * @date 2022/5/29
 * @since JDK 11
 */
public final class JsonUtils {

	private JsonUtils() {
	}

	/**
	 * 根据JSON字符串解析出java对象
	 * <p>
	 * 需要提供java对象类型
	 *
	 * @param text  JSON字符串,不能为<code>NULL</code>
	 * @param clazz java对象类型
	 * @return java对象
	 */
	public static final <T> T parse(String text, Class<T> clazz) {
		return JSON.parseObject(text, clazz);
	}

	/**
	 * 根据字节数组解析出java对象
	 * <p>
	 * 需要提供java对象类型
	 *
	 * @param input 字节数组
	 * @param clazz java对象类型
	 * @return java对象
	 */
	public static final <T> T parse(byte[] input, Class<T> clazz) {
		return JSON.parseObject(input, clazz, new Feature[0]);
	}

	/**
	 * 根据java对象转换成字节数组
	 * <p>
	 * 按照默认方式转换,只输出属性和属性值信息,不加入任何其他类型信息
	 *
	 * @param object java对象
	 * @return 字节数组
	 */
	public static final byte[] toJSONBytes(Object object) {
		return JSON.toJSONBytes(object, new SerializerFeature[0]);
	}

	/**
	 * 获取JSON串中指定的key对应的值
	 *
	 * @param json
	 * @param key
	 * @return String
	 * @author 
	 * @date 2018年11月12日
	 * @since JDK 11
	 */
	public static String getJsonValue(String json, String key) {
		if (StringUtils.isBlank(json) || StringUtils.isBlank(key)) {
			return null;
		}
		JSONObject jsonObj = JSONObject.parseObject(json);
		return jsonObj.getString(key);
	}

	/**
	 * 获取JSON串中指定的key对应的值
	 *
	 * @param json 数组
	 * @param key
	 * @return String
	 * @author 
	 * @date 2018年12月12日
	 * @since JDK 11
	 */
	public static List<String> getJsonArrayValue(String json, String key) {

		if (StringUtils.isBlank(json) || StringUtils.isBlank(key)) {
			return null;
		}

		List<String> list = new ArrayList<>();

		JSONArray jsonArray = JSON.parseArray(json);

		if (jsonArray != null) {

			for (int i = 0; i < jsonArray.size(); i++) {

				JSONObject jsonObj = jsonArray.getJSONObject(i);

				list.add(jsonObj.getString(key));
			}
		}
		return list;
	}

	public static String toJsonStringFormat(Object obj) {
		// 自定义时间格式
		JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

		return JSON.toJSONString(obj, //
				// SerializerFeature.PrettyFormat, // 格式化结果
				SerializerFeature.WriteMapNullValue, // 输出值为null的字段
				SerializerFeature.WriteNullStringAsEmpty, // 字符类型字段如果为null,输出为”“,而非null
				// SerializerFeature.WriteNullNumberAsZero, // 数值字段如果为null,输出为0,而非null
				// SerializerFeature.DisableCircularReferenceDetect, // 消除对同一对象循环引用的问题
				SerializerFeature.WriteNullListAsEmpty, // List字段如果为null,输出为[],而非null
				SerializerFeature.WriteDateUseDateFormat, // 自定义时间格式
				SerializerFeature.DisableCircularReferenceDetect // 消除循环引用
		);
	}
}

6. 实体类

import java.util.Date;

import com.fasterxml.jackson.annotation.JsonFormat;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;


@Data
@EqualsAndHashCode(callSuper = false)
@ToString(callSuper = true)
public class SmsSendRecord implements Serializable {

    private static final long serialVersionUID = -2051624697942261462L;

    private String id;

    /** 第三方系统编码(见接口文档) */
	private String sysCode;

	/** 第三方系统名称(见接口文档) */
	private String sysName;

	/** 功能名称 */
	private String functions;

	/** 手机号 */
	private String phone;

	/** 短信内容 */
	private String smsContent;

	/** 第三方发送请求时间戳 */
	private Long reqTime;

	/** 发送时间 */
	// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	private Date sendTime;

	/** 发送状态(0:失败, 1:成功) */
	private Integer sendStatus;

	/** 发送失败信息 */
	private String failMsg;

	/** 短信条数(短信内容以67个字符为一条短信) */
	private Long smsCount;

    private String status;

    // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createDate;

    private String createBy;

    // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateDate;

    private String updateBy;

    private String remarks;
}
import java.io.Serializable;
import java.util.Date;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

/**
 * 【Elasticsearch】短信发送记录 实体类
 * 
 * @author 
 * @date 2024/6/5
 * @since JDK 17
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ToString(callSuper = true)
@Document(indexName = "sms_send_record", createIndex = false)
public class EsSmsSendRecord implements Serializable {

	private static final long serialVersionUID = 621657165808034654L;

	/*
    @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都是不能够被拆分的,并且date是默认不创建索引的。
    */

	/** 主键 */
	@Field(name = "id", type = FieldType.Keyword)
	@Id
	private String id;

	/** 第三方系统编码 */
	@Field(name = "sys_code", type = FieldType.Text)
	private String sysCode;

	/** 第三方系统名称 */
	@Field(name = "sys_name", type = FieldType.Text)
	private String sysName;

	/** 功能名称 */
	@Field(name = "functions", type = FieldType.Text)
	private String functions;

	/** 手机号 */
	@Field(name = "phone", type = FieldType.Text)
	private String phone;

	/** 短信内容 */
	@Field(name = "sms_content", type = FieldType.Text, analyzer = "jieba_index", searchAnalyzer = "jieba_index")
	private String smsContent;

	/** 第三方发送请求时间戳 */
	@Field(name = "req_time", type = FieldType.Long)
	private Long reqTime;

	/** 发送时间 */
	@Field(name = "send_time", type = FieldType.Date)
	private Date sendTime;

	/** 发送状态(0:失败, 1:成功) */
	@Field(name = "send_status", type = FieldType.Integer)
	private Integer sendStatus;

	/** 发送失败信息 */
	@Field(name = "fail_msg", type = FieldType.Text, analyzer = "jieba_index", searchAnalyzer = "jieba_index")
	private String failMsg;

	/** 短信条数(短信内容以67个字符为一条短信) */
	@Field(name = "sms_count", type = FieldType.Long)
	private Long smsCount;

	/** 状态(0:正常, 1:已删除, 2:已停用) */
	@Field(name = "status", type = FieldType.Keyword)
	private String status;

	/** 创建时间 */
	@Field(name = "create_date", type = FieldType.Date)
	private Date createDate;

	/** 创建人 */
	@Field(name = "create_by", type = FieldType.Text)
	private String createBy;

	/** 更新时间 */
	@Field(name = "update_date", type = FieldType.Date)
	private Date updateDate;

	/** 更新人 */
	@Field(name = "update_by", type = FieldType.Text)
	private String updateBy;

	/** 备注 */
	@Field(name = "remarks", type = FieldType.Text)
	private String remarks;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值