柳州制作网站深圳市建设工程交易服务网宝安

张小明 2026/1/13 0:18:40
柳州制作网站,深圳市建设工程交易服务网宝安,天津网站优化方案,小语种网站制作Java Elasticsearch 全量 增量同步实战#xff1a;打造高性能合同搜索系统在企业合同管理系统中#xff0c;我们常常遇到以下挑战#xff1a;合同量大#xff0c;文本内容多#xff0c;传统数据库查询慢搜索需求多样#xff1a;全文搜索、按签署人筛选、分页排序历…Java Elasticsearch 全量 增量同步实战打造高性能合同搜索系统在企业合同管理系统中我们常常遇到以下挑战合同量大文本内容多传统数据库查询慢搜索需求多样全文搜索、按签署人筛选、分页排序历史合同也要可搜索不仅仅是新建合同统计报表需求合同签署量、签署人分析等本文将分享如何使用Elasticsearch MySQL ClickHouse构建一个高性能合同搜索系统并提供完整 Java 示例。一、系统架构概览合同系统采用“三角架构”┌───────────────────────┐ │ 前端 / API │ │ 创建 / 修改 / 查询 │ └─────────┬─────────────┘ │ ▼ ┌───────────────────────┐ │ MySQL 数据库 │ │ 权威业务数据源 │ └─────────┬─────────────┘ │ ┌──────────────┴───────────────┐ │ │ 【历史数据全量初始化】 【增量同步 / 实时更新】 │ │ ▼ ▼ 分页 / 批量读取历史合同 新建合同 / 修改合同 / 删除合同 │ │ ▼ ▼ 转换为 ContractDoc 转换为 ContractDoc │ │ ▼ ▼ ES Bulk API ES Index / Update / Delete API │ │ └───────────┬──────────────────┘ ▼ ┌───────────────┐ │ Elasticsearch │ │ contract │ │ index │ └───────────────┘ │ ▼ ┌───────────────┐ │ 查询接口 │ │合同列表 / 搜索│ └───────────────┘核心说明MySQL权威数据源存储所有合同业务信息ES用于搜索支持全文搜索、筛选和排序ClickHouse用于统计报表处理大规模合同分析二、为什么使用宽表1. 什么是宽表宽表 把多张业务表的数据提前合并到一张字段很多的表里用“空间换时间”减少查询时的 join。传统 MySQL 查询可能涉及多个 join性能差SELECT c.*, u.name, e.enterprise_name FROM contract c JOIN user u ON c.user_id u.id JOIN enterprise e ON c.enterprise_id e.id WHERE c.status SIGNED;宽表设计后所有信息在一条记录中{ contractId: 10001, contractTitle: 劳动合同, contractStatus: SIGNED, signTime: 2025-12-01 10:30:00, initiatorId: 2001, initiatorName: 张三, initiatorPhone: 138****, enterpriseId: 3001, enterpriseName: 天津数字认证有限公司, fileHash: xxxx, signType: SILENT, source: OPEN_API }查询无需 joinES 或 ClickHouse 查询极快冗余换来性能是搜索系统的设计常态三、ES 全量初始化历史数据1. Java 代码示例全量导入Service public class ContractEsService { Autowired private ContractMapper contractMapper; Autowired private RestHighLevelClient esClient; /** * 全量初始化合同数据到 Elasticsearch */ public void initHistoricalContracts() throws IOException { int pageSize 500; int page 0; while (true) { ListContract contracts contractMapper.selectHistorical(page * pageSize, pageSize); if (contracts.isEmpty()) break; BulkRequest bulkRequest new BulkRequest(); for (Contract contract : contracts) { ContractDoc doc toContractDoc(contract); bulkRequest.add(new IndexRequest(contract_index) .id(String.valueOf(doc.getContractId())) .source(doc.toMap())); } esClient.bulk(bulkRequest, RequestOptions.DEFAULT); page; } } private ContractDoc toContractDoc(Contract contract) { ContractDoc doc new ContractDoc(); doc.setContractId(contract.getId()); doc.setContractTitle(contract.getTitle()); doc.setContractStatus(contract.getStatus()); doc.setSignTime(contract.getSignTime()); doc.setInitiatorId(contract.getUserId()); doc.setInitiatorName(contract.getUserName()); doc.setInitiatorPhone(contract.getUserPhone()); doc.setEnterpriseId(contract.getEnterpriseId()); doc.setEnterpriseName(contract.getEnterpriseName()); doc.setFileHash(contract.getFileHash()); doc.setSignType(contract.getSignType()); doc.setSource(contract.getSource()); return doc; } }✅说明分批读取避免内存爆炸BulkRequest提高写入性能ContractDoc为宽表结构支持全文搜索四、增量同步1. 新建合同public void saveContract(Contract contract) throws IOException { contractMapper.insert(contract); // 写 MySQL ContractDoc doc toContractDoc(contract); esClient.index(new IndexRequest(contract_index) .id(String.valueOf(doc.getContractId())) .source(doc.toMap()), RequestOptions.DEFAULT); // 写 ES }2. 更新合同public void updateContract(Contract contract) throws IOException { contractMapper.update(contract); ContractDoc doc toContractDoc(contract); esClient.update(new UpdateRequest(contract_index, String.valueOf(doc.getContractId())) .doc(doc.toMap()), RequestOptions.DEFAULT); }3. 删除合同public void deleteContract(Long contractId) throws IOException { contractMapper.delete(contractId); esClient.delete(new DeleteRequest(contract_index, String.valueOf(contractId)), RequestOptions.DEFAULT); }五、查询示例public ListContractDoc searchContracts(String keyword, String status) throws IOException { SearchRequest searchRequest new SearchRequest(contract_index); SearchSourceBuilder sourceBuilder new SearchSourceBuilder(); BoolQueryBuilder boolQuery QueryBuilders.boolQuery(); if (keyword ! null) { boolQuery.must(QueryBuilders.multiMatchQuery(keyword, contractTitle, enterpriseName)); } if (status ! null) { boolQuery.filter(QueryBuilders.termQuery(contractStatus, status)); } sourceBuilder.query(boolQuery).from(0).size(20); searchRequest.source(sourceBuilder); SearchResponse response esClient.search(searchRequest, RequestOptions.DEFAULT); ListContractDoc results new ArrayList(); for (SearchHit hit : response.getHits()) { results.add(ContractDoc.fromMap(hit.getSourceAsMap())); } return results; }支持全文搜索和条件过滤支持分页支持宽表字段查询无需 join六、增量 历史数据同步策略总结数据类型处理方式历史合同全量初始化→ 批量写入 ES新建合同实时写入 ES更新合同实时更新 ES删除合同实时删除 ES建议增量同步可结合消息队列 CDC保证最终一致性历史数据初始化建议在低峰时执行分批写入七、总结宽表 ES提高合同搜索性能避免 join全量初始化历史数据ES 支持既往合同搜索增量同步保证新数据实时可查三角架构MySQL ES ClickHouse各司其职MySQL权威数据ES快速搜索ClickHouse报表分析【聚合极快、适合统计数据量亿级报表】通过这套设计合同系统既能秒级响应搜索又能提供高效报表分析满足大规模企业业务需求。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

深圳建设局网站微网站模板代码

从零开始做一辆会“认路”的小车:Arduino寻迹实战全记录你有没有想过,让一个小车自己沿着黑线跑,不用遥控、也不靠人推?这听起来像是机器人比赛里的高科技项目,其实——用一块Arduino板子、几个红外传感器和电机驱动模…

张小明 2026/1/12 15:33:39 网站建设

中国移动网站在线oa免费crm

💕💕作者: 米罗学长 💕💕个人简介:混迹java圈十余年,精通Java、小程序、数据库等。 💕💕各类成品Java毕设 。javaweb,ssm,springboot等项目&#…

张小明 2026/1/12 19:54:06 网站建设

网站建设公司扬州用户体验 网站

各位编程领域的同仁,大家下午好!今天,我们齐聚一堂,探讨一个在操作系统核心领域极具变革性的议题:如何利用 Rust 语言的所有权模型,为 Linux 内核驱动的开发带来革命性的内存安全保障。这不仅仅是关于采用一…

张小明 2026/1/5 7:56:08 网站建设

大庆百度公司网站建设西安有做网站的吗

瑞昱Realtek无线网卡8188GU驱动:Windows与Linux双平台终极解决方案 【免费下载链接】瑞昱Realtek无线网卡8188GU驱动Windows 本仓库提供了一个适用于瑞昱Realtek无线网卡8188GU的Windows驱动程序。该驱动程序是从水星MW150UH驱动中提取出来的,可以作为Nd…

张小明 2026/1/5 7:55:04 网站建设

怎么入侵网站后台管理福州手游网站建设

微信机器人技术演进分析微信机器人技术从UI自动化到现代协议客户端的演进,反映了技术方案的成熟过程。以下分阶段解析技术特点及适用场景。wechatapi.netUI自动化时代(2013-2016)采用模拟点击操作的初级方案,典型技术包括&#xf…

张小明 2026/1/5 7:54:00 网站建设

网站备案 注册用户做网站直接开二级域名

CogAgent-9B震撼发布:纯视觉交互重塑2025人机协作新范式 【免费下载链接】cogagent-vqa-hf 项目地址: https://ai.gitcode.com/zai-org/cogagent-vqa-hf 导语 清华大学与智谱AI联合推出的CogAgent-9B-20241220版本,以11201120高分辨率视觉输入和…

张小明 2026/1/9 12:26:23 网站建设