发布时间:2026/7/18 12:43:50
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/7/18 12:43:50

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

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

2026/7/18 12:43:50

从零到精通: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/7/18 12:43:50

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

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

2026/7/18 13:59:19

Python异步下载B站视频:突破大会员限制的完整解决方案

Python异步下载B站视频:突破大会员限制的完整解决方案 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 在数字内容日益丰富…

2026/7/18 13:59:19

051、ISP Pipeline架构设计:从RAW到YUV的端到端流水线

051、ISP Pipeline架构设计:从RAW到YUV的端到端流水线 去年夏天,某款旗舰手机在暗光场景下预览画面总是偏紫,调试了三天,最后发现是ISP pipeline里AWB模块的色温估计被前级DPC模块的坏点校正干扰了。这种“前级挖坑后级填”的破事…

2026/7/18 13:54:18

3步开启Windows蓝屏模拟器:安全体验逼真系统崩溃的艺术

3步开启Windows蓝屏模拟器:安全体验逼真系统崩溃的艺术 【免费下载链接】BluescreenSimulator Bluescreen Simulator for Windows 项目地址: https://gitcode.com/gh_mirrors/bl/BluescreenSimulator 想象一下,你正在给朋友演示计算机故障排查&am…

2026/7/17 5:59:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/18 10:53:38

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/17 7:39:19

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/18 0:00:24

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/17 14:59:44

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…