做网站及APP厦门谷歌seo公司有哪些

张小明 2026/1/8 4:51:11
做网站及APP,厦门谷歌seo公司有哪些,福田做棋牌网站建设找哪家公司好,网站建设实验小结手把手教你用 Spring Boot 整合 Elasticsearch 实现高性能分页搜索你有没有遇到过这样的场景#xff1a;用户在电商网站里输入“苹果手机”#xff0c;结果半天搜不出来#xff1f;或者后台系统翻到第100页时#xff0c;接口直接超时崩溃#xff1f;这不是数据库的错——当…手把手教你用 Spring Boot 整合 Elasticsearch 实现高性能分页搜索你有没有遇到过这样的场景用户在电商网站里输入“苹果手机”结果半天搜不出来或者后台系统翻到第100页时接口直接超时崩溃这不是数据库的错——当数据量上百万后传统的LIKE %关键词%查询早已不堪重负。而真正的解法藏在一个名字听起来就很“高大上”的组合里Spring Boot Elasticsearch。今天我们就来干一票实战从零开始把 Elasticsearch 和 Spring Boot 深度整合实现一个支持中文分词、高效分页、可扩展的搜索服务。不玩虚的每一步都贴着真实项目走。为什么是它不是 MySQL 全文索引也不是手写 Lucene先说个真相Elasticsearch 不是数据库的替代品而是它的“超级外挂”。想象一下你的商品表有500万条记录。用 MySQL 的LIKE去查“蓝牙耳机”哪怕加了索引也得扫几万行更别提“无线 耳机”这种多词匹配根本没法精准召回。而 Elasticsearch 是干嘛的它基于倒排索引构建就像字典按拼音排序一样能快速定位“包含某个词”的所有文档。支持分布式部署横向扩容轻松应对亿级数据。天然支持复杂查询模糊匹配、同义词、拼音纠错、范围筛选……统统不在话下。再加上 Spring Boot 这个“自动化神器”我们几乎不用关心连接池、序列化、HTTP客户端这些底层细节——一切交给框架自动装配。所以这个组合的核心价值是什么让开发者专注业务逻辑而不是和搜索引擎的 REST API 打交道。第一步搭架子 —— Spring Boot 怎么连上 ES别急着写代码先搞清楚我们要用什么工具链。技术选型要点组件推荐版本说明Spring Boot2.7.x / 3.x注意与 Spring Data Elasticsearch 版本对齐Elasticsearch7.17.x稳定或 8.x生产环境建议选 LTS 版本客户端spring-data-elasticsearch封装了操作 API比原生调用清爽太多Maven 依赖长这样dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-elasticsearch/artifactId /dependencyYAML 配置也很简单spring: data: elasticsearch: client: reactive: endpoints: localhost:9200只要这一句Spring Boot 就会自动创建ElasticsearchRestTemplate和响应式客户端开箱即用。⚠️ 注意Elasticsearch 7.x 和 8.x 的 Java 客户端差异较大如果你用的是新版请确认使用ElasticsearchClient而非旧版RestHighLevelClient。本文以主流的 7.17.x 为例。第二步定义实体 —— 数据怎么存进 ES在关系型数据库里我们习惯用 JPA 注解映射表结构。在 ES 里也类似只不过对象叫“文档”集合叫“索引”。来看一个典型的商品实体类Document(indexName product) public class Product { Id private String id; Field(type FieldType.Text, analyzer ik_max_word, searchAnalyzer ik_smart) private String name; Field(type FieldType.Double) private Double price; Field(type FieldType.Keyword) private String category; // getter/setter 省略 }关键点解读Document(indexName product)声明这个类对应 ES 中的product索引Id标识主键字段对应_idFieldType.TextvsFieldType.KeywordText类型会被分词适合标题、描述等需要全文检索的字段Keyword不分词用于精确匹配如分类、状态码analyzer ik_max_word索引时尽量拆出更多词提高召回率searchAnalyzer ik_smart查询时用智能模式减少噪音。看到这里你可能会问IK 分词器是什么为什么要装它因为 ES 默认不支持中文分词如果你不做任何处理“华为手机”会被当成一个整体词项存储搜“华”或“手机”都找不到。而 IK 分词器可以把它切成 “华为”、“手机”、“华”、“为”……大大提升搜索命中率。安装方式很简单# 进入 ES 插件目录 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.0/elasticsearch-analysis-ik-7.17.0.zip重启节点即可生效。第三步实现搜索 —— 分页怎么做才不卡终于到了最核心的部分如何安全地做分页搜索很多人一开始都会这么写.withPageable(PageRequest.of(page, size))看起来没问题但有个致命陷阱深分页问题。深分页为啥危险ES 内部是这样工作的查询请求发到每个分片每个分片本地排序并返回前from size条结果协调节点合并所有分片的结果再截取[from, fromsize)返回。这意味着当你查第 1000 页每页10条系统其实要拉取每个分片的前 10010 条数据一旦超过默认限制index.max_result_window10000就会报错Result window is too large, from size must be less than or equal to: [10000]而且性能急剧下降——CPU、内存、网络全被拖垮。那怎么办难道不让用户翻那么多页当然不是。正确姿势有两个方案适用场景是否推荐from/size前100页以内✅ 浅分页可用search_after深分页、无限滚动✅✅✅ 强烈推荐我们重点讲search_after。search_after 实战如何实现“下一页”功能它的原理很简单不用偏移量而是记住上一页最后一个文档的排序值作为下一页的起点。比如你按价格排序上一页最后一个是price2999那么下一页就从 “大于2999”的第一条开始取。代码怎么写Service public class ProductService { Autowired private ElasticsearchRestTemplate elasticsearchTemplate; public SearchPageProduct searchProducts(String keyword, ListObject searchAfter, int size) { // 构建查询条件 QueryStringQueryBuilder queryBuilder QueryBuilders.queryStringQuery(keyword) .field(name); // 设置排序字段必须唯一 FieldSortBuilder sortBuilder SortBuilders.fieldSort(price).order(SortOrder.ASC); NativeSearchQuery query new NativeSearchQueryBuilder() .withQuery(queryBuilder) .withSorts(sortBuilder) .withSearchAfter(searchAfter) // 关键传入上一页末尾的排序值 .withPageable(PageRequest.of(0, size)) // 只取一页 .build(); SearchHitsProduct hits elasticsearchTemplate.search(query, Product.class); return SearchHitSupport.searchPageFor(hits, query.getPageable()); } }前端交互示例// 第一次请求无 search_after GET /api/products/search?keyword手机size10 // 返回结果中带上下一页锚点 { content: [...], search_after: [2999] // 下次请求带上这个值 } // 第二次请求 GET /api/products/search?keyword手机search_after2999size10优点非常明显无状态无需维护 scroll 上下文性能稳定不会随页数增加而变慢适合移动端“加载更多”场景。 小贴士search_after要求排序字段组合必须唯一。如果只按价格排可能重复建议加上_id.withSorts(SortBuilders.fieldSort(price), SortBuilders.fieldSort(_id))第四步暴露接口 —— 让前端真正用起来控制器层非常干净RestController RequestMapping(/api/products) public class ProductController { Autowired private ProductService productService; GetMapping(/search) public ResponseEntitySearchPageProduct search( RequestParam String keyword, RequestParam(required false) ListString searchAfterStr, RequestParam(defaultValue 10) int size) { // 字符串转 Object 列表注意类型匹配 ListObject searchAfter searchAfterStr ! null ? searchAfterStr.stream().map(this::convert).collect(Collectors.toList()) : null; SearchPageProduct result productService.searchProducts(keyword, searchAfter, size); return ResponseEntity.ok(result); } private Object convert(String value) { try { return Long.parseLong(value); } catch (NumberFormatException e) { try { return Double.parseDouble(value); } catch (NumberFormatException ex) { return value; } } } }返回结构如下{ content: [ { id: 101, name: 小米手机, price: 1999 }, ... ], page: { totalElements: 847, totalPages: -1, size: 10, hasContent: true, hasNext: true }, search_after: [1999, 102] // price _id }前端拿到search_after后拼接 URL就能实现平滑翻页。最佳实践总结老司机才知道的坑1. 别轻易改max_result_window虽然可以通过以下命令放宽限制PUT /product/_settings { index.max_result_window: 50000 }但这是饮鸩止渴。真正应该做的是引导前端改用search_after。2. 用 DTO 包装返回结果永远不要直接把 Entity 返回给前端原因有三可能暴露敏感字段如成本价ES 文档结构可能和前端需求不一致后期调整字段不影响接口契约。3. 控制刷新频率提升写入性能默认情况下 ES 每秒刷新一次refresh_interval: 1s保证近实时可见。但在大批量导入数据时可以临时关闭PUT /product/_settings { refresh_interval: -1 }等导入完成后再恢复吞吐量能提升好几倍。4. 监控不能少重点关注几个指标JVM Heap 使用率避免 OOMGC 频率频繁 Full GC 要警惕线程池拒绝数bulk queue rejected慢查询日志开启 slowlog 定位瓶颈Kibana 是标配配上之后排查问题效率翻倍。结语这不是终点而是起点到现在为止我们已经完成了一个工业级搜索模块的基础搭建✅ Spring Boot 自动集成✅ 中文分词精准匹配✅ 分页机制安全可控✅ 接口设计简洁清晰但这只是开始。你可以继续往上面叠加能力加一层 Redis 缓存热门关键词结果用 Logstash 同步 MySQL 商品数据实现准实时索引更新接入 APM 工具监控搜索延迟基于用户行为做相关性排序优化……最终你会发现掌握 Elasticsearch Spring Boot 的组合拳不只是学会了一个技术更是获得了一种构建高性能系统的思维方式。下次当你面对“搜索慢、分页卡、中文不准”这些问题时心里已经有答案了。如果你正在做一个内容平台、电商平台或日志系统不妨试试这套方案。跑通第一个 demo 后你会回来感谢自己的。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

商城网站功能文档福建省建设人才与科技发展中心网站

分布式锁技术深度解析:从理论到微服务架构实战 【免费下载链接】codis 项目地址: https://gitcode.com/gh_mirrors/cod/codis 在当今微服务架构盛行的时代,分布式锁已成为保障系统数据一致性的关键技术组件。本文将从技术原理出发,深…

张小明 2026/1/7 4:43:58 网站建设

网站主题旁边的图标怎么做的湖南做网站公司有哪些

还在为手动抄写TikTok视频文案而熬夜加班吗?想不想在1分钟内就获得高清视频的完整字幕内容?今天我要分享的这个神奇工具,将彻底改变你处理视频字幕的方式! 【免费下载链接】TikTokDownload 抖音去水印批量下载用户主页作品、喜欢、…

张小明 2026/1/7 4:43:26 网站建设

南京网站制作服务商discuz和wordpress

蓝屏故障定位实战:从DMP文件还原崩溃现场你有没有遇到过这样的场景?服务器毫无征兆地重启,登录后只留下一个冰冷的蓝屏一闪而过。没有日志、没有报警,唯一的线索是系统在C:\Windows\Minidump\下生成的一个几MB大小的.dmp文件。这&…

张小明 2026/1/7 4:42:54 网站建设

达州住房和城乡建设部网站wordpress新建表

文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 💛博主介绍&#…

张小明 2026/1/7 4:42:22 网站建设

网站建设硬件设备高中做信息技术题网站

AnomalyGPT完整指南:零阈值智能工业缺陷检测系统 【免费下载链接】AnomalyGPT 项目地址: https://gitcode.com/gh_mirrors/an/AnomalyGPT AnomalyGPT作为首个基于大视觉语言模型的工业异常检测解决方案,彻底改变了传统依赖人工阈值的检测方式&am…

张小明 2026/1/7 4:41:49 网站建设

中学网上做试卷的网站如何做阿里巴巴的网站

ComfyUI高级用户都在用的vLLM加速技巧 在如今AIGC创作愈发依赖大模型推理效率的背景下,一个让人又爱又恨的问题浮出水面:明明硬件配置不低,为什么生成一段文本还是慢得像“卡顿的视频”?尤其是在ComfyUI这类可视化工作流平台中&am…

张小明 2026/1/7 4:41:17 网站建设