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 之间的调用关系:
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 版本号 |