Laravel集成Elasticsearch实现高效中文搜索方案

发布时间:2026/9/10 7:05:56

Laravel集成Elasticsearch实现高效中文搜索方案 1. 为什么需要专门的中文搜索方案在Laravel项目中实现中文搜索一直是个痛点。MySQL的LIKE查询不仅效率低下而且无法处理中文分词的问题。比如搜索冬季奥运会时标准分析器会把每个汉字拆分开来导致搜索结果不准确。Elasticsearch作为专业的搜索引擎通过特定的分词插件可以完美解决这个问题。我最近在一个电商项目中就遇到了这个需求商品名称和描述需要支持中文搜索而且搜索结果要能按相关度排序。经过多次尝试最终确定了LaravelElasticsearchIK分词器的技术方案。2. 环境准备与安装2.1 Elasticsearch安装与配置首先需要在服务器上安装Elasticsearch。推荐使用7.x以上版本因为对中文支持更好。在Ubuntu上安装很简单wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - sudo apt-get install apt-transport-https echo deb https://artifacts.elastic.co/packages/7.x/apt stable main | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list sudo apt-get update sudo apt-get install elasticsearch安装完成后需要修改配置文件/etc/elasticsearch/elasticsearch.ymlcluster.name: my-application network.host: 0.0.0.0 http.port: 9200 discovery.type: single-node然后启动服务sudo systemctl start elasticsearch sudo systemctl enable elasticsearch2.2 IK分词器安装Elasticsearch默认的分词器对中文不友好我们需要安装IK分词器cd /usr/share/elasticsearch/bin sudo ./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.3/elasticsearch-analysis-ik-7.17.3.zip安装后需要重启Elasticsearchsudo systemctl restart elasticsearch可以通过以下命令测试IK分词器是否工作正常curl -X POST localhost:9200/_analyze -H Content-Type: application/json -d { analyzer: ik_max_word, text: 中华人民共和国 } 应该能看到正确的分词结果。3. Laravel项目集成3.1 安装必要的PHP包在Laravel项目中我们需要安装elasticsearch/elasticsearch和laravel/scoutcomposer require elasticsearch/elasticsearch composer require laravel/scout然后发布Scout的配置文件php artisan vendor:publish --providerLaravel\Scout\ScoutServiceProvider在config/scout.php中配置Elasticsearch连接elasticsearch [ index env(ELASTICSEARCH_INDEX, laravel), hosts [ env(ELASTICSEARCH_HOST, http://localhost:9200), ], ],3.2 模型配置假设我们要对Product模型建立搜索索引首先需要在模型中引入Searchable traituse Laravel\Scout\Searchable; class Product extends Model { use Searchable; public function toSearchableArray() { return [ id $this-id, name $this-name, description $this-description, price $this-price, ]; } }3.3 创建索引映射为了让Elasticsearch正确处理中文我们需要为索引创建自定义映射use Elasticsearch\ClientBuilder; $client ClientBuilder::create()-setHosts([env(ELASTICSEARCH_HOST)])-build(); $params [ index products, body [ settings [ analysis [ analyzer [ ik_analyzer [ type custom, tokenizer ik_max_word, filter [lowercase] ] ] ] ], mappings [ properties [ name [ type text, analyzer ik_analyzer, search_analyzer ik_analyzer ], description [ type text, analyzer ik_analyzer, search_analyzer ik_analyzer ], price [ type float ] ] ] ] ]; $response $client-indices()-create($params);4. 实现中文搜索功能4.1 数据索引在数据量不大的情况下可以直接使用Scout提供的命令创建索引php artisan scout:import App\Models\Product对于大数据量建议分批处理Product::chunk(500, function ($products) { $products-searchable(); });4.2 基本搜索实现在控制器中实现搜索功能public function search(Request $request) { $query $request-input(q); $products Product::search($query) -where(price, , 0) -orderBy(price, desc) -paginate(10); return view(products.search, compact(products, query)); }4.3 高级搜索功能如果需要更复杂的搜索条件可以直接使用Elasticsearch的DSL查询$params [ index products, body [ query [ bool [ must [ [match [ name [ query $query, operator and ] ]], [range [ price [ gte $minPrice, lte $maxPrice ] ]] ] ] ], highlight [ fields [ name new \stdClass(), description new \stdClass() ] ] ] ]; $response $client-search($params);5. 性能优化与问题排查5.1 索引优化对于中文搜索合理的索引设置可以大幅提升性能settings [ number_of_shards 3, number_of_replicas 1, analysis [ analyzer [ ik_analyzer [ type custom, tokenizer ik_max_word, filter [lowercase, stop, trim] ] ], filter [ stop [ type stop, stopwords [的, 了, 和] ] ] ] ]5.2 常见问题解决分词不准确可以通过扩展IK分词器的词典来解决。在config/analysis-ik/目录下添加自定义词典。搜索结果不符合预期检查查询时使用的分析器是否和索引时一致。可以使用Explain API分析查询过程curl -X GET localhost:9200/products/_explain/1 -H Content-Type: application/json -d { query : { match : { name : 手机 } } } 索引速度慢可以调整refresh_interval参数settings [ refresh_interval 30s ]6. 实际应用案例在我最近开发的电商平台中实现了以下搜索功能智能提示使用Elasticsearch的Completion Suggester实现mappings [ properties [ name_suggest [ type completion ] ] ]同义词搜索通过配置同义词过滤器filter [ my_synonym [ type synonym, synonyms [ 手机, 智能手机, 移动电话, 电脑, 计算机, 笔记本 ] ] ]搜索结果高亮$params [ body [ query [...], highlight [ pre_tags [em classhighlight], post_tags [/em], fields [ name new \stdClass(), description new \stdClass() ] ] ] ];7. 维护与监控7.1 索引维护定期优化索引curl -X POST localhost:9200/products/_optimize?max_num_segments1监控索引状态curl -X GET localhost:9200/_cat/indices?v7.2 性能监控使用Elasticsearch的监控APIcurl -X GET localhost:9200/_nodes/stats?pretty对于生产环境建议安装Kibana进行可视化监控。8. 扩展思考多语言支持如果需要支持多种语言可以设置多字段映射mappings [ properties [ title [ type text, fields [ zh [ type text, analyzer ik_analyzer ], en [ type text, analyzer english ] ] ] ] ]搜索结果排序可以根据业务需求自定义排序规则body [ query [...], sort [ [price [order desc]], _score ] ]分布式部署对于大型应用需要考虑Elasticsearch集群部署cluster.name: my-cluster node.name: node-1 discovery.seed_hosts: [host1, host2] cluster.initial_master_nodes: [node-1, node-2]
延伸阅读

更多相关文章

2026/9/10 18:11:10

嵌入式开发中的标准I/O流:stdin、stdout、stderr详解与应用

在嵌入式开发和系统编程面试中,"程序运行默认打开3个流"是一个经典的基础问题。这个问题看似简单,却涉及到底层I/O机制、操作系统原理和C语言标准库的实现细节。理解这三个标准流对于调试程序、重定向输入输出、处理文件操作都至关重要。1. 理…

2026/9/10 11:41:06

从零到精通:Reloaded-II游戏Mod开发实战指南

从零到精通:Reloaded-II游戏Mod开发实战指南 【免费下载链接】Reloaded-II Universal .NET Core Powered Modding Framework for any Native Game X86, X64. 项目地址: https://gitcode.com/gh_mirrors/re/Reloaded-II Reloaded-II是一个基于.NET Core的通用…

2026/9/10 13:16:31

程序员考公指南:技术流备考与体制生存实战

1. 项目背景与核心价值去年有个在互联网大厂工作的朋友找我喝酒,三杯下肚就开始吐槽:"天天996,35岁危机像把刀悬在头上,真不知道这行还能干几年。"两个月后,他给我发了张公务员录取通知书的照片。这不是个例…

2026/9/10 18:08:58

多AI编程Agent难管理?T3 Code统一控制台让并行开发可控可回放

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/10 18:08:58

灰色预测GM(1,1)实战:小样本时序建模与Python工程实现

简介:本资源是一套面向数据分析初学者与Python实践者的灰色预测模型入门级代码实现包,聚焦小样本、含噪、非平稳时间序列的短期趋势预测问题,适用于科研建模、课程设计及工程预研场景。压缩包共6个文件,含5个Python脚本&#xff0…

2026/9/10 18:08:57

OpenCV凸缺陷+余弦定理实现五类手势识别

简介:这是一套面向计算机专业本科生的Python毕业设计实战资源,聚焦基于OpenCV的手势识别系统开发,适用于课程设计、毕设选题及图像处理入门实践。项目采用凸包与凸缺陷检测(cv2.convexHull cv2.convexityDefects)核心…

2026/9/10 18:08:57

核心JAR包设计:Spring Boot自动配置与模块化实践

接手这个项目的第三周,我终于撑不住把JSCM-CORE.jar的文档推倒重写了。原因很简单:之前的文档只写“有什么类”,但完全没讲清楚“为什么这么设计”——团队新人每次集成都要来问我一遍,而我每次都要从“你先把 Spring Boot 的自动…

2026/9/10 18:08:57

AI Agent如何接管Vivado进行FPGA开发

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/10 18:03:56

Unity编辑器点击物体Hierarchy不高亮?重置布局一分钟搞定

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/10 16:39:38

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码