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

发布时间:2026/11/5 19:15:26

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/11/5 19:15:21

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

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

2026/11/4 1:16:12

从零到精通: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/10/25 0:37:27

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

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

2026/11/5 16:51:33

EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析

1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被…

2026/11/5 16:26:13

Rust原来很简单二:所有权系统

Part 2 核心篇 —— 所有权系统 本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理 6…

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

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

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

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

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

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

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

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

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

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