目录


目录网站成功的关键要素

目录网站的核心价值在于连接用户与商家、服务或资源。典型案例有 Yelp、Zocdoc、Avvo,以及更垂直的本地餐厅指南或专业服务目录。这一商业模式经久不衰,市场需求持续存在——每个行业都存在可切入的目录机会。

决定一个目录网站能否长期存活,归根结底取决于三点:数据质量、搜索体验和 SEO。如果你的列表信息不完整、搜索响应迟缓,或者 Google 无法抓取你的页面,这个目录注定会失败。

Next.js 天然适合构建目录网站,因为它能很好地化解一个根本性矛盾:目录网站既需要数以千计的 SEO 友好静态页面(用于列表详情和分类页),又需要动态交互功能(搜索、筛选、地图、用户账户)。Next.js 通过对列表页面使用静态生成、对动态功能使用服务端组件,同时满足这两类需求。

目录网站的常见类型

商家目录 — 本地或行业专属的商家列表,通过精选置顶和广告变现。

专业人士目录 — 医生、心理咨询师、顾问等服务提供者的查找平台,通过订阅和线索生成变现。

资源目录 — 工具、软件、课程或数据集的精选汇总,通过联盟营销和赞助变现。

市场型目录 — 支持预订或购买功能的列表平台(Airbnb 模式),通过交易抽佣变现。

社群目录 — 协会、校友网络或组织的成员名录。

选择正确的架构方案

渲染策略

对于列表数量在 5 万条以内的目录,静态生成结合 ISR(增量静态再生) 是最优方案:在构建时生成所有列表页面,实现秒开加载和完美的 SEO 效果;配合 60 秒的 ISR 重新验证窗口,确保内容更新在一分钟内生效;搜索结果和筛选视图则交由服务端组件处理,始终返回最新数据。

当列表数量超过 10 万条时,应切换到按需 ISR 模式——页面在首次访问时生成并缓存。

数据层

我们推荐使用 PostgreSQL(通过 Supabase 或 Neon 托管)。它原生支持通过 tsvector 实现全文检索,通过 PostGIS 实现地理查询,并支持 JSONB 存储灵活的列表属性。一个数据库即可应对所有场景。

备选方案: 需要高级搜索功能时选 Elasticsearch,追求开箱即用的托管搜索服务选 Algolia,或选用自托管的 Meilisearch 作为替代。

列表数据库设计

核心数据表

listings(列表主表) — 核心数据表。每条列表包含名称、slug、描述、分类、地理位置(经纬度)、联系信息、状态,以及一个用于灵活扩展属性的 metadata JSONB 字段。

categories(分类表) — 通过 parent_id 自引用实现层级分类结构,支持如「医疗保健 > 牙科 > 美容牙科」这样的多级嵌套。

locations(地址表) — 规范化的地址数据:城市、省/州、国家、邮政编码、坐标。坐标字段使用 PostGIS 的 geography 类型。

reviews(评价表) — 用户评价,包含评分(1-5 分)、评价内容、用户引用和列表引用。聚合评分直接存储在 listings 表中,加快读取速度。

media(媒体表) — 关联到列表的图片和文档。只存储 URL,不存文件本身,图片分发通过 CDN 处理。

用 JSONB 实现灵活属性

不同行业的列表字段各有不同。餐厅目录需要菜系类型、价格区间和营业时间;牙科目录需要支持的医保类型、专科方向和资质认证。与其为每个垂直行业单独建表,不如使用 JSONB 类型的 attributes 字段。这样无需进行 schema 迁移就能添加新字段,同时仍可通过 PostgreSQL 的 JSONB 操作符支持条件筛选查询。

真正高效的搜索与筛选

搜索是目录网站最核心的交互。如果结果超过 200 毫秒才出现,用户就会离开。

全文搜索

PostgreSQL 的全文搜索能满足大多数目录场景,无需引入外部服务。具体做法:创建一个整合名称、描述和分类文本的 tsvector 字段,建立 GIN 索引加速检索,使用 ts_rank 进行相关性排序,并支持短语匹配和布尔运算符。

对于自动补全功能,可创建一个带三元索引的 search_terms 物化视图(使用 pg_trgm 扩展)。这样可以实现容错打字的即时联想提示。

多维筛选

关键在于预计算筛选数量。当用户在「伦敦」选择「牙科」时,在点击之前就展示每个子筛选条件下的结果数量。这需要并发执行多个计数查询,PostgreSQL 在建立合适索引后可高效处理。

地图集成与地理定位

地图服务商选择

Mapbox GL JS — 开发体验最佳,默认地图样式精美,免费额度慷慨(每月 5 万次地图加载)。这是我们的推荐选择。

Google Maps — 普及度高,但规模化使用成本较贵。

Leaflet + OpenStreetMap — 完全免费的开源方案。

地图 UX 模式

  • 缩小视图时对标记点进行聚合显示
  • 地图移动时同步更新列表——让列表结果与地图可视区域保持联动
  • 悬停高亮——用户悬停在某条列表时,高亮对应的地图标记
  • 移动端优先展示列表——默认显示列表视图,提供「查看地图」切换入口

用户提交与认领列表

提交流程

允许商家通过多步表单提交列表:基本信息、详细资料、媒体上传、身份验证,最后经管理员审核后发布。

认领已有列表

如果目录预先填充了数据,商家需要通过电话验证、明信片确认或企业邮箱域名匹配等方式来认领自己的列表。认领成功后,商家可通过管理后台编辑自己的列表信息。

目录网站的 SEO 策略

URL 结构

同时为用户和搜索引擎设计 URL:

  • /dentists/ — 分类落地页
  • /dentists/london/ — 分类 + 城市
  • /dentists/london/cosmetic/ — 分类 + 城市 + 子分类
  • /listing/smile-dental-clinic — 单条列表详情页

程序化 SEO

以一个覆盖 50 个城市、每城 10 个专科方向的牙科目录为例,可以通过模板批量生成 500 个独特落地页——每个页面精准命中特定的长尾关键词。这正是 Next.js 目录网站在 SEO 上的核心优势所在。

变现模式

精选置顶 — 每月 ¥300-3000。订阅分级 — 基础版免费,高级版每月 ¥150-700。线索收费 — 每条线索 ¥30-350。广告投放 — 在高流量页面展示广告。数据授权 — 出售匿名化的目录数据。联盟与返佣 — 从预订中抽取佣金。

大规模场景下的性能优化

缓存策略

静态页面通过边缘 CDN 分发,搜索结果在 Redis 中缓存 60 秒,地图瓦片由服务商负责,图片通过 CDN 配合强缓存策略分发。

构建时间优化

当列表页面超过 1 万条时,改用按需 ISR 替代部署时全量构建;按更新频率对页面分组;使用带分页的 generateStaticParams 并行化生成过程。

常见问题

上线时需要准备多少条列表? 在一个聚焦的地区或细分领域内,至少准备 200-500 条高质量列表。只有 50 条稀疏列表的目录看起来像是废弃项目。

为什么不直接用 WordPress 配目录插件? WordPress 目录插件在列表达到约 5000 条时就会遭遇性能瓶颈,搜索体验差,地图交互卡顿,扩容还需要昂贵的主机费用。相比之下,Next.js 在任何规模下都更快、更灵活、托管成本更低。

搭建一个目录网站需要多少费用? 定制化的 Next.js 目录网站造价通常在 ¥10 万到 ¥55 万之间,具体取决于复杂程度。一个基础 MVP 版本可以在 6-8 周内完成。

如何处理重复列表? 在提交环节就进行去重:通过名称 + 地址 + 电话号码三者组合匹配。引入模糊匹配来识别近似重复的条目。

这套方案能构建双边市场平台吗? 完全可以。在目录基础上加入预订或购买功能,它就升级为了市场平台。引入 Stripe Connect 即可处理买家与服务提供方之间的支付结算。