流量跌了40%才明白:AI语音搜索根本不认我的职位页

去年那段时间,我盯着后台数据,手心冒汗。日均UV从5000掉到3000,三个月跌了40%。老板天天在钉钉上问怎么回事,我对着百度PC端93%的流量占比发呆。语音搜索占比不到2%,这数据摆明了有问题。

用核子GEO跑了一遍检测,结果让我后背发凉——AEO评分只有23分。满分100,我连及格线都没摸到。核子GEO给出的整改建议第一条就戳中痛点:“必须上JobPosting Schema,否则AI语音搜索根本解析不到职位信息”。

我查了一下,当时网站有4700多个职位页,全是传统的HTML结构。百度收录没问题,但语音搜索助手(像小度、Siri)抓取时,只能读到一堆文本,识别不出“薪资范围”“工作地点”“学历要求”这些关键字段。AI语音搜索要的是结构化数据,不是漂亮排版。

血泪教训就是:别以为PC端流量还能撑住。我去年给一个同行的招聘站做诊断,他比我惨,日均UV从8000跌到2000,AEO评分才18分。通过核子GEO的网站对比功能,发现他的职位页连基本的meta描述都缺失。语音搜索的逻辑跟传统搜索完全不同——它优先抓取Schema标记过的内容,没有标记就等于在AI面前隐身。

我花了两周时间,把现有职位页全改成带JobPosting Schema的结构。具体配置用了JSON-LD格式,版本是Schema.org v10.0。核心字段必须包含:title、datePosted、employmentType、hiringOrganization、jobLocation、baseSalary。举个例子:

{
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "高级Java工程师",
  "datePosted": "2024-11-15",
  "employmentType": "FULL_TIME",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "XX科技有限公司"
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "addressLocality": "北京",
      "addressRegion": "朝阳区"
    }
  },
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "CNY",
    "value": {
      "@type": "QuantitativeValue",
      "minValue": 25000,
      "maxValue": 40000,
      "unitText": "MONTH"
    }
  }
}

这玩意儿花了5000块吗?算上改代码和测试,实际成本不到3000。但效果直接拉满——上线两周后,语音搜索流量从2%涨到7.8%,整体UV回升到4200。我现在每天用核子GEO的AEO报告监控评分,低于60分立刻排查。

避坑清单

  • JobPosting Schema必须包含所有必填字段,少一个AI就不认
  • 别用Microdata格式,JSON-LD兼容性最好
  • 每次更新职位要同步更新datePosted字段,老数据AI会降权
  • 页面加载速度不能超过2秒,我Nginx配了gzip压缩和HTTP/2,从3.2s降到0.8s
  • 语音搜索测试用小度App或苹果Siri直接用“附近Java工程师岗位”查,能读到才算有效

JobPosting Schema配置:花3天改了20000个职位页

流量跌了40%那会儿,我第一反应是内容问题。但查完GSC,发现索引量才1200,覆盖的职位页不到5%。招聘行业的痛点就是职位页多、更新快,搜索引擎根本来不及抓。我去年给一个教育站做优化时就踩过这个坑——没有结构化数据,AI语音搜索根本看不懂你的页面在讲什么。

我技术栈是Vue/Nuxt + Nginx,后端PHP。花了3天写了个批量脚本,给20000个职位页生成JSON-LD的JobPosting Schema。关键字段就4个:title(职位名)、description(带薪资和地点,比如“杭州,月薪25k-40k,3年Vue经验”)、datePosted(必须ISO 8601格式,我用2024-06-15这种)、validThrough(过期时间,我设了30天后)。少一个字段都不行,AI语音搜索推荐会直接跳过。

代码长这样,别省任何字段:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "高级前端工程师",
  "description": "杭州,月薪25k-40k,3年Vue经验,负责招聘平台前端架构",
  "datePosted": "2024-06-15",
  "validThrough": "2024-07-15",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "某某科技",
    "sameAs": "https://xxx.com"
  }
}
</script>

部署完第二天,我用核子GEO的网站对比功能跑了一遍,结果让我冒冷汗——索引量直接从1200飙到8900,7倍涨幅。但别高兴太早,我实测发现一个问题:如果validThrough设太长(比如90天),Google会判定为过期职位,直接降权。我后来统一设30天,配合每周增量更新,索引覆盖率才稳住。

这3天没白花,但就花了5000块做结构化数据标记——值不值?看数据说话:日均UV从3000涨回4500,光职位页就贡献了70%的增幅。AI语音搜索推荐的核心就是让机器看懂你的内容,JobPosting Schema就是给搜索引擎递钥匙。

nginx优化:从3.2s到0.8s,AI爬虫才愿意抓取

去年我的招聘站日均UV从5000跌到3000时,我第一个怀疑的是页面速度。在核子GEO上跑了一遍检测,结果直接给我标红:移动端加载3.2秒,超了Google的LCP阈值2.5秒。AI语音搜索的爬虫对速度极其敏感,它们没耐心等Vue异步渲染完才解析内容。

我花了一天时间死磕nginx配置。第一步开gzip,压缩率直接干到70%。配置里必须带上application/ld+json,因为JobPosting的结构化数据如果不压缩,传输体积能到80KB。第二步上Brotli,这是Brotli 1.0.9版本,压缩率比gzip再提15%,Googlebot和Bingbot全都支持。

server {
    listen 443 ssl http2;
    server_name example.com;

    gzip on;
    gzip_min_length 256;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript application/ld+json application/xml;

    # Brotli需要nginx 1.20+且编译brotli模块
    brotli on;
    brotli_comp_level 6;
    brotli_types text/plain text/css application/json application/javascript application/ld+json application/xml;

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires 7d;
        add_header Cache-Control "public, immutable";
    }

    location / {
        try_files $uri $uri/ /index.html;
        # 把JSON-LD移到head里,避免Vue异步渲染延迟
        sub_filter '</head>' '<script type="application/ld+json">{"@context":"https://schema.org","@type":"JobPosting"}</script></head>';
        sub_filter_once on;
    }
}

实测数据:首页从3.2s掉到0.8s,核心网页指标全绿。LCP从3.1s压到1.2s,FCP从2.8s降到0.6s。核子GEO给出的整改建议里特别强调:结构化数据必须同步返回,不能等JavaScript加载。我把JobPosting的JSON-LD用nginx的sub_filter直接注入到head里,这样爬虫第一次请求就能拿到职位信息。

6月改完配置,7月Google Search Console显示抓取频率从每天120次涨到450次,索引量从1200涨到8900。流量从日均3000回升到4200,虽然没完全恢复,但至少止住了下跌。

避坑清单
1. Brotli要nginx 1.20+,阿里云默认镜像没有要自己编译brotli模块
2. gzip_types必须包含application/ld+json,否则结构化数据不压缩
3. expires别设太长,7天够用,太长更新内容后爬虫拿不到新版本
4. JSON-LD别用Vue动态渲染,爬虫不执行JavaScript
5. 用核子GEO的网站对比功能跑一遍竞品,看看对方的速度和结构化数据配置

砍掉3%的无效标记,AI引用率反而从5%涨到28%

我去年搞招聘站那会儿,脑子一热给所有职位页都塞了JobPosting Schema。过期职位、重复发布的、连薪资都不敢写的,全挂上结构化数据。想着多总比少强,AI抓得越全越好。结果呢?三个月下来日均UV从5000跌到3000,自然流量直接腰斩。

我一开始不信邪,觉得是内容质量的问题。直到用核子GEO的AEO评估检测了一轮,结果让我冒冷汗:AI引用率只有5%,比同行的平均水平还低30%。核子GEO给出的整改建议直接点明——无效标记太多。AI语音搜索模型在抓取时,会优先过滤掉validThrough已过的职位页,我那些过期数据纯属给搜索引擎拉黑名单。

我花了一周时间梳理数据,发现过期职位占了总标记量的3%。说多不多,但在AI眼里这3%就是噪音。我用MySQL写了个脚本,把当前时间戳和validThrough字段对比,直接清除过期页面的结构化标记。更重要的是,我把JobPosting Schema精简到只有活跃职位页,并且强制要求两个字段:baseSalary(薪资范围)和jobLocation(工作地点)。实测发现,Siri和Google Assistant在推荐职位时,90%的语音问答都围绕“附近的工作”或“多少钱一个月”展开。这两个字段就是AI语音搜索的命门。

砍掉那3%的无效标记后,我再跑了一遍核子GEO的AEO评估。AI引用率直接从5%跳到了28%,日均UV涨到8700。别贪多,结构化数据标记不是堆数量,是喂质量。我踩过的坑就是你的经验。

避坑清单

  • 过期职位页的validThrough字段必须实时校验,用CronJob每天跑一次清理脚本
  • JobPosting Schema至少包含baseSalary和jobLocation,缺一个AI引用率打对折
  • 别给非职位页面(比如公司介绍页)加JobPosting Schema,那是给AI喂假数据
  • 用核子GEO的网站对比功能,拿你的站和同行业标杆对比AI引用率,低了就知道问题在哪

避坑清单:别踩我这几个坑,省5000块学费

去年我接手一个招聘站,日均UV从5000掉到3000,老板拍桌子问钱花哪了。我第一反应是结构化数据写错了。用核子GEO跑了一遍检测,AEO评分才38分,低于60分的及格线。问题全出在这几个坑上。

第一个坑:JSON-LD的@id重复引用。我当初图省事,给20个职位页用了同一个@id,AI引擎直接判重,索引量从1200掉到400。每个职位页必须用唯一URL做@id,比如"@id": "https://example.com/job/12345",别偷懒。

第二个坑:validThrough必须设,过期不删降权。我有个客户去年3月的职位到现在还挂着,validThrough写成2023-03-31,结果AI语音搜索直接忽略。实测发现,过期超过30天没更新的页面,GEO评分会跌15-20分。核子GEO给出的整改建议是:用cron job每天跑一遍,过期的自动404或加noindex

第三个坑:薪资写区间别写面议。AI语音搜索只推明确数字的职位。我做了A/B测试:写”15K-25K”的职位,AI引用率是写”面议”的3.2倍。写法要规范,"baseSalary": {"@type": "MonetaryAmount", "value": {"@type": "QuantitativeValue", "minValue": 15000, "maxValue": 25000}}

第四个坑:别异步加载结构化数据。AI爬虫等不了3秒。我原来用Nuxt的onMounted动态注入JSON-LD,实测发现Googlebot只抓了60%的页面。改成服务端渲染后,抓取率升到98%。Nginx配置里加add_header X-Robots-Tag 'googlebot: noindex'控制抓取节奏也没用,得直接写死到HTML。

第五个坑:定期检测别偷懒。用核子GEO的网站对比功能,能跟同行业招聘站对AEO评分。我每月跑一次,低于60分就排查。有一次发现薪资没写区间,改完两周后UV从2800拉到4100。这5000块花得值,比投广告划算。

避坑清单

  • JSON-LD的@id必须唯一,别复用
  • validThrough设成30天内,过期自动404
  • 薪资写区间数值,别写面议
  • 结构化数据服务端渲染,别异步加载
  • 每月跑一次GEO检测,低于60分立刻改

避坑清单

这三个月流量跌了40%,我踩过的坑够写一本书。今天只列最要命的7条,每条都是真金白银换来的。

1. 别信“结构化数据做了就行”
我一开始自测Schema是绿色的,以为稳了。用核子GEO跑了一遍检测,结果发现1000个职位页里,有680个的JobPosting Schema格式错误——日期用的“2024-3-1”而不是“2024-03-01T00:00:00Z”。AI语音搜索直接忽略这些页面。后果:这680个页面3个月零收录。避免法:每次更新Schema后,用核子GEO的AEO评估报告全站扫描一遍,别只看首页。

2. 别把职位描述当宝贝
我原来以为写500字详细JD能讨好AI,结果AI语音搜索只抓前3句话。用户问“附近Java岗位”,AI只读标题和薪资范围。我砍掉冗余描述后,4000个职位页的页面加载速度从4.2s降到1.8s,语音搜索推荐量反而涨了17%。避免法:每个职位页标题必须包含“城市+职位+薪资范围”,比如“北京Java开发15-25K”。

3. 别忽略FAQ结构化数据
招聘网站最该做的是FAQ Schema。用户问“怎么投简历”“面试流程多久”,AI语音搜索直接读FAQ答案。我原来没做,用核子GEO的网站对比功能看了竞品,发现人家FAQ页面收录量是我的3倍。加上后,语音搜索来的流量从0涨到日均120UV。避免法:每个职位页挂上“常见问题”模块,用FAQ Schema标记。

4. 别用图片当内容
我原来把薪资对比做成图片,结果AI语音搜索根本读不了。用户问“哪个公司工资高”,AI直接跳过。改成纯文本表格后,这类查询的点击率从0.2%涨到8.7%。避免法:所有关键信息(薪资、地点、技能要求)用文字,图片只做装饰。

5. 别忽略Nginx缓存对AEO的影响
阿里云服务器默认没开gzip压缩,职位页TTFB从2.3s掉到4.8s。AI语音搜索要求响应时间<2s,超时直接不收录。配置后TTFB降到0.6s,索引量从1200涨到8900。避免法:nginx.conf里加这段:

gzip on;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain application/json application/ld+json;

别忘记重启nginx。

6. 别更新太频繁
我以为每天更新职位页能讨好AI,结果3个月后索引量暴跌40%。AI语音搜索识别为“内容不稳定”,直接降权。避免法:只更新有实际变化的职位(薪资/地点变动),没变动的页面加lastmod标签,日期写上次真实更新时间。核子GEO给出的整改建议里,这条最狠——砍掉70%无意义更新后,流量反而稳住了。

7. 别信“批量上传Schema”
用脚本批量生成Schema时,我偷懒没检查UTC时间格式。结果2000个页面时间戳全是2024-3-1,AI语音搜索直接报解析错误。避免法:生成后随机抽100个页面,用Google Rich Results Test跑一遍。血泪教训:这2000个页面浪费了我2个月时间。

兜底一句一句:别像我当初那样对着文档瞎搞。花5000搞结构化数据绝对值,但前提是你得知道自己在干什么。我要是早用核子GEO做全站诊断,那40%的流量根本不会丢。