学习笔记:Elasticsearch 文档检索系统
1. 技术栈与核心组件
- Node.js:后端运行环境,适合构建高性能 Web 服务。
- Express:Node.js 的 Web 框架,简化 API 开发。
- Elasticsearch:分布式全文检索引擎,支持高效的文本检索。
- 原生 HTML+JS:前端页面实现,便于快速演示和交互。
2. 后端实现要点
-
API 设计
/import
:导入本地 JSON 文档到 Elasticsearch,支持批量操作。/search
:根据关键词检索文档,支持多字段(标题、内容)全文检索。
-
Elasticsearch 客户端
- 使用
@elastic/elasticsearch
npm 包连接本地 ES 服务。 - 索引管理:每次导入前先删除旧索引,保证数据一致性。
- 字段映射(Mapping):定义文档结构,指定哪些字段可检索。
- 使用
-
批量导入
- 通过
bulk
API 一次性导入多条文档,提升效率。
- 通过
-
CORS 跨域
- 使用
cors
中间件,允许前端页面直接访问后端 API。
- 使用
// =========================
// 导入文档到 Elasticsearch
// =========================
app.post('/import', async (req, res) => {try {// 1. 检查索引是否存在,存在则先删除(保证每次导入都是全新数据)const exists = await esClient.indices.exists({ index: esIndex });// exists.body 为 true 表示索引存在,需先删除if (exists.body) {await esClient.indices.delete({ index: esIndex });}// 2. 创建新索引,并定义字段映射await esClient.indices.create({index: esIndex,body: {mappings: {properties: {id: { type: 'integer' }, // 文档IDtitle: { type: 'text' }, // 标题,全文检索content: { type: 'text' } // 内容,全文检索}}}});// 3. 读取本地 docs.json 文件,获取10篇文档const docs = JSON.parse(fs.readFileSync(path.join(__dirname, 'docs.json'), 'utf-8'));// 4. 构造批量导入 bodyconst body = docs.flatMap(doc => [{ index: { _index: esIndex, _id: doc.id } }, doc]);// 5. 批量导入文档到 ESawait esClient.bulk({ refresh: true, body });res.json({ success: true, message: '导入成功', count: docs.length });} catch (err) {// 错误处理res.status(500).json({ success: false, error: err.message });}
});// =========================
// 查询接口:根据关键词检索文档
// =========================
app.get('/search', async (req, res) => {const q = req.query.q || ''; // 获取查询参数try {// 调用 ES 的 search API,multi_match 支持多个字段全文检索const result = await esClient.search({index: esIndex,body: {query: {multi_match: {query: q,fields: ['title', 'content'] // 在标题和内容中查找}}}});// 取出命中结果,提取需要的字段const hits = result.hits.hits.map(hit => ({id: hit._source.id,title: hit._source.title,content: hit._source.content,score: hit._score // 相关性分数}));res.json({ success: true, data: hits });} catch (err) {// 错误处理res.status(500).json({ success: false, error: err.message });}
});
3. 前端实现要点
-
页面结构
- 搜索输入框 + 按钮,用户输入关键词后触发检索。
- 结果区域动态渲染检索到的文档列表。
-
与后端交互
- 使用
fetch
发送 GET 请求到/search
,获取 JSON 格式结果。 - 处理异常和无结果情况,提升用户体验。
- 使用
-
界面美化
- CSS 实现响应式布局和美观样式,适配不同屏幕。
- CSS 实现响应式布局和美观样式,适配不同屏幕。
4. 数据结构与流程
-
文档结构
- 每条文档包含
id
、title
、content
字段。 - 示例数据存储于
backend/docs.json
。
- 每条文档包含
-
检索流程
- 用户输入关键词,点击搜索。
- 前端调用后端
/search
接口。 - 后端在 ES 中检索,返回相关文档及分数。
- 前端展示检索结果。
5. 常见问题与调试
- Elasticsearch 未启动:后端无法连接 ES,需先启动本地 ES 服务。
- 端口冲突:确保 3001 端口未被占用。
- 跨域问题:已通过 CORS 解决,前后端可分开运行。