阿里万网站建设企业网站首页设计评价

张小明 2026/1/11 10:33:22
阿里万网站建设,企业网站首页设计评价,主题id或类的名称wordpress,做食物网站从零搭建搜索系统#xff1a;Spring Boot 集成 Elasticsearch 实战指南 你有没有遇到过这样的场景#xff1f;用户在电商网站上输入“苹果手机”#xff0c;结果搜出来的却是水果摊的“红富士苹果”#xff1b;或者后台日志堆积如山#xff0c;排查一个错误要翻几十页文本…从零搭建搜索系统Spring Boot 集成 Elasticsearch 实战指南你有没有遇到过这样的场景用户在电商网站上输入“苹果手机”结果搜出来的却是水果摊的“红富士苹果”或者后台日志堆积如山排查一个错误要翻几十页文本效率低得让人抓狂。传统数据库面对这类全文检索、模糊匹配、高并发查询的需求时往往力不从心。而现代应用对“秒级响应”“智能联想”“相关度排序”的要求越来越高——这正是Elasticsearch Spring Boot组合大显身手的地方。今天我们就来手把手带你从零开始用最实用的方式把 Elasticsearch 整合进你的 Spring Boot 项目。不讲空话只讲能跑起来的代码和避得过的坑。先别急着写代码环境准备才是第一步很多新手一上来就start.spring.io创建项目结果连 ES 都没启动成功自然没法连通。我们先搞定本地运行环境。安装 Elasticsearch 和 Kibana推荐使用 Docker如果你还在手动下载 tar 包、配置 JVM 参数、改 yml 文件……那你已经落后了。现在最简单的方式是用 Docker 一键拉起整个生态# 启动 Elasticsearch docker run -d \ --name elasticsearch \ -p 9200:9200 \ -p 9300:9300 \ -e discovery.typesingle-node \ -e ES_JAVA_OPTS-Xms512m -Xmx512m \ docker.elastic.co/elasticsearch/elasticsearch:8.11.3 # 启动 Kibana用于调试和查看数据 docker run -d \ --name kibana \ -p 5601:5601 \ --link elasticsearch:elasticsearch \ docker.elastic.co/kibana/kibana:8.11.3✅ 小贴士版本建议统一为 8.x避免客户端与服务端协议不兼容问题。Spring Data Elasticsearch 当前主流支持的是 7.17 和 8.x 版本。等两分钟打开浏览器访问 http://localhost:5601 看到 Kibana 界面说明环境 OK。搭建 Spring Boot 工程加依赖就像点外卖去 https://start.spring.io 创建一个新项目选择以下依赖Spring WebLombok可选但强烈推荐Spring Data ElasticsearchMaven 中会自动引入核心包dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-elasticsearch/artifactId /dependency然后在application.yml里配置连接地址spring: elasticsearch: uris: http://localhost:9200 username: elastic # 默认用户名8.x 版本首次启动会生成密码可在日志中查看 password: your_password启动项目只要没报Connection refused恭喜你桥梁已经搭好了写第一个能跑的搜索功能三步走战略别急着搞聚合、高亮、建议词。我们要做的第一件事是存一条数据再把它搜出来。第一步定义实体类别小看注解Document(indexName product) Data Builder NoArgsConstructor AllArgsConstructor public class Product { Id private String id; Field(type FieldType.Text, analyzer ik_max_word, searchAnalyzer ik_smart) private String title; Field(type FieldType.Keyword) private String category; Field(type FieldType.Double) private Double price; Field(type FieldType.Date) private Date createTime; }重点解释几个关键点Document(indexName product)告诉框架这个类对应 ES 的哪个索引。如果索引不存在Spring Data 会在第一次保存时尝试创建。FieldType.TextvsKeywordText类型会被分词适合标题、描述等需要模糊搜索的字段Keyword不分词用于精确匹配比如分类名手机、状态active。中文分词用了ik_max_word和ik_smart—— 这意味着你需要提前给 Elasticsearch 安装 IK 插件怎么装也很简单# 进入容器执行命令 docker exec -it elasticsearch /bin/bash ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.11.3/elasticsearch-analysis-ik-8.11.3.zip重启容器后就能用了。第二步写 Repository 接口不用实现public interface ProductRepository extends ElasticsearchRepositoryProduct, String { ListProduct findByTitleContaining(String title); ListProduct findByCategoryAndPriceBetween(String category, Double minPrice, Double maxPrice); PageProduct findByTitleContaining(String title, Pageable pageable); }看到这里你可能会问“就这么个接口真的能查数据”答案是能而且还不止这些。Spring Data 根据方法名自动解析成对应的 Query DSL。比如方法名对应的查询逻辑findByTitleContaining(手机){match: {title: 手机}}findByPriceBetween(1000, 5000)范围查询gte: 1000, lte: 5000findByCategoryOrderByPriceDesc(手机)按价格降序它背后其实是通过ElasticsearchRestTemplate发送 HTTP 请求到/product/_search只不过这一切都被封装好了。第三步Service 层调用测试Service RequiredArgsConstructor public class ProductService { private final ProductRepository productRepository; public Product save(String title, String category, Double price) { Product product Product.builder() .title(title) .category(category) .price(price) .createTime(new Date()) .build(); return productRepository.save(product); } public ListProduct searchByTitle(String keyword) { return productRepository.findByTitleContaining(keyword); } public PageProduct searchWithPageAndSort(String keyword, int page, int size) { Pageable pageable PageRequest.of(page, size, Sort.by(price).ascending()); return productRepository.findByTitleContaining(keyword, pageable); } }写个 Controller 测试一下RestController RequestMapping(/api/products) RequiredArgsConstructor public class ProductController { private final ProductService productService; PostMapping public Product create(RequestBody Product product) { return productService.save(product.getTitle(), product.getCategory(), product.getPrice()); } GetMapping(/search) public ListProduct search(RequestParam String keyword) { return productService.searchByTitle(keyword); } GetMapping(/browse) public PageProduct browse( RequestParam String keyword, RequestParam(defaultValue 0) int page, RequestParam(defaultValue 10) int size) { return productService.searchWithPageAndSort(keyword, page, size); } }启动项目发请求试试# 存一条数据 curl -X POST http://localhost:8080/api/products \ -H Content-Type: application/json \ -d {title:华为Mate60 Pro,category:手机,price:6999} # 搜关键词 curl http://localhost:8080/api/products/search?keyword华为如果返回了数据恭喜你第一个搜索功能跑通了为什么比 MySQL LIKE 快聊聊底层原理你说我用LIKE %华为%不也能搜出来吗确实可以但在百万数据下性能差距不是一点半点。方式查询方式性能表现适用场景MySQL LIKE全表扫描O(n)慢小数据量Elasticsearch 倒排索引索引跳转O(log n)毫秒级大数据量举个例子你想找所有包含“手机”的商品。MySQL得一行行读每条记录判断title LIKE %手机%是否成立Elasticsearch则维护了一个“词 → 文档 ID”的映射表倒排索引直接定位到哪些文档含有“手机”这个词效率极高。这也是为什么电商、内容平台几乎都用 ES 做搜索的核心原因。实战中的那些“坑”和“秘籍”坑一中文不分词 or 分错词默认情况下Elasticsearch 对中文是一个字一个字切分比如“华为手机”变成华、为、手、机导致搜“华为”可能找不到。✅ 解决方案必须上IK 分词器它可以识别出“华为”“手机”“Mate60”这样的词汇。验证是否生效POST /_analyze { analyzer: ik_max_word, text: 华为Mate60 Pro发布 }理想输出应该是[华为, Mate60, Pro, 发布]而不是单个汉字。坑二深度分页崩溃from size 超过 10000很多人做导出功能时写Pageable pageable PageRequest.of(1000, 10); // 第1000页每页10条当from size 10000时ES 默认会拒绝请求防止内存爆炸。✅ 正确做法用search_after// 获取上次最后一条的结果排序值作为下次起点 SearchAfterPageRequest.of(searchAfterValues, size, Sort.by(price));适用于滚动加载、大数据导出等场景。坑三数据不同步怎么办你在 MySQL 改了数据但 ES 里还是旧的。这是典型的数据一致性问题。常见解决方案有三种方案优点缺点双写数据库和 ES实现简单容易丢失同步数据库 binlog 监听Canal/Maxwell异步可靠架构复杂消息队列中转Kafka解耦、削峰成本上升中小型项目建议先用双写 重试机制Retryable(value {ElasticsearchException.class}, maxAttempts 3) public void asyncUpdateEs(Product product) { productRepository.save(product); }配合Recover做失败补偿。进阶方向下一步你可以探索什么当你掌握了基础 CRUD 和搜索之后不妨试试这些提升体验的功能1. 高亮显示关键词让用户一眼看出哪里匹配了NativeQuery.build().withQuery(q - q.match(m - m.field(title).query(华为))) .withHighlightFields(new HighlightBuilder.Field(title))前端收到em华为/emMate60这样的片段轻松高亮。2. 聚合分析统计销量 Top10 分类Aggregation aggregation productRepository.search(AggregateUtil.terms(by_category, category), Page.empty());可用于生成报表、筛选面板。3. 搜索建议Suggester用户打“苹”提示“苹果手机”“苹果耳机”suggest: { text: 苹, term-suggest: { field: title.suggest } }需提前设置completion类型字段。4. 搭建 ELK 日志平台把 Logstash 或 Filebeat 接入收集应用日志到 ES用 Kibana 查看异常堆栈、请求趋势真正实现“可观测性”。写在最后技术的价值在于解决问题Elasticsearch 整合 Spring Boot并不是一个炫技的操作它的真正价值在于解决实际业务痛点用户想要“快准狠”地找到商品运维需要快速定位线上错误产品经理希望增加“猜你喜欢”“热门搜索”这些需求的背后都是搜索能力的体现。而 Spring Data Elasticsearch 让我们不必深陷 REST API 和 JSON 拼接的泥潭专注在业务逻辑本身。这才是现代开发应有的样子。所以别再犹豫了。照着这篇教程跑一遍亲手把第一个Product存进 Elasticsearch 吧。当你看到搜索结果在毫秒内弹出时你会明白这条路走对了。如果你在集成过程中遇到了版本冲突、连接超时、分词失败等问题欢迎在评论区留言我们一起排雷。创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站服务器位置查询做网站数据库坏了

作为技术人员,我们对语音合成技术肯定不陌生——不管是做智能助手、教育产品还是客服系统,都希望机器能说出自然、贴合场景的真人语音。但以往要么是商用系统成本太高,要么是开源方案效果不尽如人意,总让人有种“两难”的感觉。 …

张小明 2026/1/10 6:25:17 网站建设

门户网站建设多少钱深圳seo优化排名推广

第一章:Agent工具与Dify集成的核心价值在现代AI应用开发中,Agent工具通过自主决策、任务分解与外部系统交互等能力,显著提升了自动化水平。将Agent与Dify平台集成,能够充分发挥Dify在可视化编排、模型管理与API服务化方面的优势&a…

张小明 2026/1/5 22:36:41 网站建设

公司外宣网站wordpress博客广告收益

什么是策略模式? 策略模式的 主要包含三个组件 抽象策略类, 环境类, 具体的策略类。 抽象策略类 我理解 其实就是要解决的问题, 具体的策略类 则是在不同的条件下 解决这个问题的处理逻辑, 而环境类 就是负责在不同条…

张小明 2026/1/6 8:37:56 网站建设

门户网站建设公司报价有域名 如何免费建设网站

目录已开发项目效果实现截图已开发项目效果实现截图开发技术系统开发工具:核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部…

张小明 2026/1/6 14:48:32 网站建设

广州的房地产网站建设一个网站能用asp c

GConf编程指南 1. 引入GConf到应用程序 若要在应用程序中使用GConf,需在应用程序头文件中添加客户端包含文件: #include <gconf/gconf−client.h>可以使用 pkg-config (包名: gconf−2.0 )获取头文件和库的路径。不过,如果程序是GNOME应用程序,这并非必要…

张小明 2026/1/9 15:48:23 网站建设

网站设计排名北京知名网站制作服务

Fast-GitHub&#xff1a;彻底解决GitHub访问难题的完整方案 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 国内开发者在日常工作中…

张小明 2026/1/10 14:03:04 网站建设