96SEO 2026-09-15 18:13 38
本人个人博客地址:Egg-blog
先看改造前的搜索接口实现,问题一目了然:
// 改造前:ArticleServiceImpl.searchArticleByContentList articles = articleMapper.selectList(
new LambdaQueryWrapper
.like // 全表扫描!.eq),// 每次搜索还把分类表整张捞一遍
Map categoryMap = categoryMapper.selectList.stream...
前后都带通配符的 LIKE 无法走任何 B+ 树索引,每次搜索都是对 article_content字段的全表扫描。文章还少的时候无感,文本量上到几十万字以后每一次搜索都是对数据库的一次毒打。
因为查询太贵,接口只能挂 @AccessLimit 硬扛——每分钟最多搜 次使用者体验极差。限流的意义本该是防爬虫防滥用,结果变成了给慢查询擦屁股。
原实现里截取搜索摘要的逻辑是这样的:
int index = -1;// 定义在循环外,for {
index = content.toLowerCase.indexOf);...
}
if { // 只判断了最终一篇
return listVos;}
return List.of;
index 定义在循环体外循环结束后只剩最终一篇文章的命中状态——只要最终一篇没命中,哪怕前面全命中了也直接返回空列表。怎么说呢,搜索“偶尔抽风查不到”的灵异现象,根源就在这。
主要思路: 调用方只依赖抽象接口,搜索引擎可插拔、可降级。
ArticleController │ 只依赖接口
▼
┌─────────────────┐
│ SearchService │ ← 搜索引擎抽象层
└─────────────────┘
▲ ▲
│ @Primary │ 永远注册
┌──────┴────────┐ ┌───────┴───────────────┐
│ EsSearch │ │ NgramSearch │
│ ServiceImpl │──▶│ ServiceImpl │
│ │降级│
└───────────────┘ └───────────────────────┘
配置驱动。一行切换:
search:
engine这方面,ngram # ngram | es
说到es,host:
port这方面,
再看scheme,http
index-name: blog_article
@ConditionalOnProperty: ES相关Bean仅在es模式下装配;ngram模式零开销,@Primary: ES实现优先注入;ES异常时自动降级到ngram,实现无感知。
@Override public List searchArticleByContent {
try {
return doSearch);} catch {
log.warn);try {
return ngramSearchService.searchArticleByContent;} catch {
log.error);return List.of;}
}
}
ALTER TABLE `t_article` ADD FULLTEXT INDEX `ft_article_content` WITH PARSER ngram;
@Select "
+ "AGAINST IN BOOLEAN MODE) "
+ "AND status = #{status} AND is_deleted = ") List searchByContentFulltext String keyword,@Param Integer status);/*
* 注意:
* keyword传入前必须清洗掉双引号和反斜杠,否则短语查询直接报废;* 最小长度从1改为2,因为ngram是二元切分;不过,*/
String cleanKeyword = keyword.replaceAll.trim;if ) {
return List.of;}
`
`
`
`
`
`
`
`
`
两个细节这方面。
-
短语匹配 : AGAINST,ngram 会把短语切成 bigram 并要求连续出现,与原来 LIKE '%keyword%' 完全一致,但走的是索引;不过,
-
输入清洗 :双引号和反斜杠会破坏短语语法。需要洗掉,同时把关键词最小长度从1改成2。
顺手修掉的历史欠账
-
循环外 index 的 bug:每篇文章各自定位命中位置截摘要,如果定位不到就取开头兜底;
-
全表捞分类的观点是,改成按命中文章的 categoryId 批量 selectBatchIds。其实,
适用边界
百万~千万字符级别、低 QPS 的个人博客。ngram 闭眼用,它的短板不在性能而在效果 :二元切词不懂词语边界。相关度排序粗糙,没有高亮、同义词、拼音这些花活。要玩这些得上 ES,按理说,<\/strong>
<\/
<\/
<\/
<\/
<\/
<\/
<\/
">
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback