2026/4/18 8:26:51
网站建设
项目流程
网站建设哪些公司,做app软件大概多少钱,网站维护客户,seo公司多少钱PHP 文章搜索功能看似简单#xff0c;实则涉及 查询性能、相关性排序、高亮展示、扩展性 四大工程维度。
90% 的“搜索慢、结果不准”源于“直接用 LIKE 硬扛”#xff0c;而非技术不足。一、搜索层级#xff1a;从简单到专业层级技术方案适用场景QPS延迟L1. 全文模糊WHERE …PHP 文章搜索功能看似简单实则涉及查询性能、相关性排序、高亮展示、扩展性四大工程维度。90% 的“搜索慢、结果不准”源于“直接用LIKE硬扛”而非技术不足。一、搜索层级从简单到专业层级技术方案适用场景QPS延迟L1. 全文模糊WHERE title LIKE %keyword%小数据量1万10500msL2. MySQL 全文索引MATCH(title) AGAINST(keyword)中数据量100万10050msL3. 专用搜索引擎Elasticsearch / Meilisearch大数据量100万1k10msL4. 向量搜索Pinecone / Weaviate语义搜索100100ms核心数据量 1 万行 → 必须放弃LIKE。二、技术选型PHP 搜索方案对比1. MySQL 全文索引L2优点无需新组件集成简单缺点中文分词弱相关性差适用英文/数字搜索小团队配置-- 创建全文索引ALTERTABLEarticlesADDFULLTEXT(title,content);-- 查询SELECT*,MATCH(title,content)AGAINST(php)ASscoreFROMarticlesWHEREMATCH(title,content)AGAINST(php)ORDERBYscoreDESC; **2. Elasticsearch **(L3)优点高性能、中文分词、高亮、聚合缺点运维复杂资源消耗大适用中大型项目PHP 客户端elasticsearch/elasticsearch **3. Meilisearch **(L3)优点轻量、开箱即用、中文支持好缺点功能少于 ES适用中小项目快速上线PHP 客户端meilisearch/meilisearch-php✅推荐新项目用 Meilisearch存量用 Elasticsearch。3. 代码实现三种方案实战方案 1MySQL 全文索引L2// 搜索类classMySQLSearch{privatePDO$pdo;publicfunctionsearch(string$keyword,int$limit20):array{// 转义特殊字符$keyword$this-escapeBooleanMode($keyword);$sql SELECT id, title, content, MATCH(title, content) AGAINST (? IN BOOLEAN MODE) AS score FROM articles WHERE MATCH(title, content) AGAINST (? IN BOOLEAN MODE) ORDER BY score DESC LIMIT ? ;$stmt$this-pdo-prepare($sql);$stmt-execute([$keyword,$keyword,$limit]);return$stmt-fetchAll(PDO::FETCH_ASSOC);}privatefunctionescapeBooleanMode(string$keyword):string{// 转义 -* 等特殊字符returnpreg_replace(/([\-\(\)~*\])/,\\\$1,$keyword);}} **方案 2Meilisearch **(L3)// 初始化useMeilisearch\Client;$clientnewClient(http://127.0.0.1:7700,masterKey);$index$client-index(articles);// 索引数据$index-addDocuments([[id1,titlePHP Guide,content...],// ...]);// 搜索$results$index-search(php,[limit20,attributesToHighlight[title,content]]);// 高亮展示foreach($results[hits]as$hit){echo$hit[_formatted][title]??$hit[title];} **方案 3Elasticsearch **(L3)// 初始化useElasticsearch\ClientBuilder;$clientClientBuilder::create()-build();// 索引数据$params[indexarticles,id1,body[titlePHP Guide,content...]];$client-index($params);// 搜索$params[indexarticles,body[query[multi_match[queryphp,fields[title^2,content]]],highlight[fields[titlenew\stdClass(),contentnew\stdClass()]]]];$response$client-search($params);四、避坑指南五大高危误区 误区 1“直接用 LIKE 搜索”真相LIKE %keyword%无法用索引 → 全表扫描解法1 万行以上用全文索引/ES 误区 2“忽略中文分词”真相MySQL 默认分词器不支持中文解法MySQL用ngram分词innodb_ft_parserngramES/Meilisearch内置中文分词 误区 3“不分页搜索”真相10 万结果 → 内存溢出解法强制分页LIMIT 20 误区 4“不处理 SQL 注入”真相全文搜索仍需转义解法escapeBooleanMode()转义特殊字符 误区 5“实时索引所有更新”真相高频更新 → ES 写入压力大解法批量索引每 5 分钟同步一次五、终极心法搜索是相关性的艺术不要只返回“包含关键词”的结果而要返回“用户最想要”的结果。脆弱搜索LIKE全表扫描 → 慢、不准韧性搜索ES/Meilisearch 相关性排序 高亮结果前者是功能后者是体验。真正的搜索能力不在“能查”而在“查得准”。六、行动建议今日搜索方案升级## 1 2025-10-01 搜索方案升级 ### 1. 评估数据量 - [ ] 1 万 → MySQL 全文索引 - [ ] 1 万 → Meilisearch ### 2. 实现核心逻辑 - [ ] MySQL: escapeBooleanMode MATCH AGAINST - [ ] Meilisearch: addDocuments search ### 3. 验证性能 - [ ] 10 万数据 → 搜索延迟 100ms ### 4. 添加高亮 - [ ] 前端展示 _formatted 字段✅完成即构建专业搜索系统。当你停止用“LIKE”应付搜索开始用“相关性”设计体验搜索就从功能变为产品竞争力。这才是专业 PHP 工程师的搜索观。