2. 环境搭建:安装 Elasticsearch 与 Kibana、创建 NestJS 项目、安装依赖

本章是构建搜索服务的基础设施环节。我们将完成三件事:在本地运行 Elasticsearch 与 Kibana 容器、初始化 NestJS 项目、安装并验证 @nestjs/elasticsearch 与 @elastic/elasticsearch 依赖。这三步完成后,你的开发环境就具备了从“写入数据”到“可视化查询”的完整链路。

环境版本约定:本课程使用 Elasticsearch 8.11.0 + Kibana 8.11.0 + Node.js 18 LTS + NestJS 10.x。版本不一致可能导致 API 差异,建议严格对齐。

2.1 安装 Elasticsearch 与 Kibana(Docker Compose)

推荐使用 Docker Compose 同时启动 Elasticsearch 和 Kibana,避免手动配置集群和证书的繁琐步骤。在项目根目录创建 docker-compose.yml:

version: '3.8'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    container_name: es-search-course
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    ports:
      - "9200:9200"
      - "9300:9300"
    volumes:
      - es_data:/usr/share/elasticsearch/data

  kibana:
    image: docker.elastic.co/kibana/kibana:8.11.0
    container_name: kibana-search-course
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch

volumes:
  es_data:

启动命令:

docker compose up -d

等待约 30 秒后,验证服务是否就绪:

# 检查 Elasticsearch
curl http://localhost:9200
# 预期返回包含 "cluster_name" : "docker-cluster" 的 JSON

# 检查 Kibana
curl http://localhost:5601/api/status
# 预期返回 status.overall.level 为 "available"
安全提示:生产环境必须启用 xpack.security,并配置密码和 TLS 证书。本课程为本地开发关闭了安全认证,方便调试。

2.2 创建 NestJS 项目

使用 Nest CLI 初始化项目,并选择包管理器(推荐 pnpm 或 yarn):

# 全局安装 Nest CLI(如已安装可跳过)
npm install -g @nestjs/cli

# 创建项目
nest new search-service
cd search-service

项目结构初始化完成后,核心目录如下:

目录/文件 用途
src/ 应用源代码目录
src/app.module.ts 根模块,后续将导入 ElasticsearchModule
src/main.ts 应用入口,可在此配置全局管道和过滤器
nest-cli.json Nest 构建配置
tsconfig.json TypeScript 编译配置

2.3 安装 Elasticsearch 相关依赖

安装两个核心包:

npm install @nestjs/elasticsearch @elastic/elasticsearch

安装完成后,检查 package.json 中的版本:

{
  "dependencies": {
    "@nestjs/elasticsearch": "^10.0.0",
    "@elastic/elasticsearch": "^8.11.0"
  }
}
版本兼容性:@nestjs/elasticsearch 10.x 要求 @elastic/elasticsearch 8.x。如果使用 7.x 版本的 Elasticsearch 客户端,需要安装 @nestjs/elasticsearch 9.x。请勿混用大版本。

2.4 依赖关系与架构概览

下图展示了 NestJS 应用、Elasticsearch 客户端、Elasticsearch 服务端以及 Kibana 之间的调用关系:

NestJS 搜索服务 — 环境架构图 NestJS 应用 SearchService @nestjs/elasticsearch Nest 封装层 @elastic/elasticsearch 官方客户端 Elasticsearch 端口 9200 Kibana 端口 5601 说明:Kibana 通过 Elasticsearch REST API 读取数据,不经过 NestJS 应用层,用于调试和可视化查询。

2.5 验证依赖安装

在 src/app.module.ts 中快速导入 ElasticsearchModule 并配置连接,验证安装是否成功:

import { Module } from '@nestjs/common';
import { ElasticsearchModule } from '@nestjs/elasticsearch';

@Module({
  imports: [
    ElasticsearchModule.register({
      node: 'http://localhost:9200',
    }),
  ],
})
export class AppModule {}

启动应用:

npm run start:dev

观察控制台输出,如果没有报错,说明 NestJS 已成功连接到 Elasticsearch。你可以进一步在 main.ts 中添加一个快速健康检查:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ElasticsearchService } from '@nestjs/elasticsearch';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const esService = app.get(ElasticsearchService);
  const info = await esService.info();
  console.log('Elasticsearch 版本:', info.version.number);
  await app.listen(3000);
}
bootstrap();

如果控制台打印出类似 Elasticsearch 版本: 8.11.0 的信息,则环境搭建全部完成。

2.6 环境搭建检查清单

检查项 验证方法 预期结果
Elasticsearch 运行 curl http://localhost:9200 返回 JSON,包含 version.number
Kibana 运行 浏览器访问 http://localhost:5601 Kibana 界面正常加载
NestJS 项目创建 npm run start:dev 控制台无报错,监听 3000 端口
依赖安装 npm list @nestjs/elasticsearch @elastic/elasticsearch 显示正确的版本号
连接验证 应用启动时调用 esService.info() 打印 Elasticsearch 版本号