4、技术栈详解:Python 3.10+、Elasticsearch 8.x、Flask、Jieba分词、Docker部署
好,咱们这一章来聊聊技术栈。说白了,就是搭这个搜索引擎项目,到底要用哪些家伙什儿。
我见过不少新手,一上来就追求「最新最热」的框架。结果呢?光环境就折腾三天,项目还没跑起来,热情先凉了半截。我个人习惯是:选稳定、够用、社区活跃的。咱们这个项目,我挑了下面这五样。
4.1 Python 3.10+:为什么不是 3.6 或 3.12?
Python 3.10 有个我特别喜欢的特性——结构模式匹配(就是 match...case)。写搜索路由的时候,处理不同查询类型,代码会清晰很多。
核心原因:
- 3.10 引入了
match语句,写条件分支更优雅 - 类型提示更完善(
|操作符表示联合类型) - 性能比 3.8/3.9 有小幅提升
我的小建议:别用 3.12 以下版本了。3.8 虽然还能用,但很多新库已经开始放弃支持。你想想看,万一装个依赖报错,多闹心。
嗯,这里要注意:如果你用的是 Mac M1/M2 芯片,装 Python 3.10 时记得选 arm64 版本。我曾经在这上面踩过坑,装了个 x86 的,跑起来总感觉慢半拍。
4.2 Elasticsearch 8.x:搜索的发动机
Elasticsearch 8.x 相比 7.x,最大的变化是默认开启了安全配置。这对新手来说,既是好事也是麻烦。
好事是:你从一开始就养成了安全习惯。麻烦是:配置稍微多了一步。
避坑指南:我曾经在 8.0 刚发布时,直接拿 7.x 的配置去跑,结果 Elasticsearch 死活起不来。后来才发现,8.x 默认启用了 HTTPS 和用户认证。所以,开发环境记得关掉安全配置,或者用 elasticsearch-reset-password 重置密码。
咱们项目里用到的核心功能:
| 功能 | 说明 | 对应 API |
|---|---|---|
| 全文搜索 | 对文章标题和内容进行分词匹配 | match / multi_match |
| 高亮显示 | 搜索结果中标记关键词 | highlight |
| 聚合分析 | 统计搜索词频率、分类统计 | aggs |
| 分页 | 控制每页返回结果数 | from / size |
4.3 Flask:轻量级 Web 框架
为什么选 Flask 而不是 Django?
说白了,咱们这个项目是搜索服务,不是内容管理系统。不需要 Django 那一套 ORM、Admin、表单。Flask 够轻、够灵活,写几个 API 端点就完事了。
我个人习惯用 Flask 的 Blueprint 来组织代码。比如:
# 项目结构示意
app/
├── search/ # 搜索相关路由
│ ├── __init__.py
│ └── routes.py
├── index/ # 索引管理路由
│ ├── __init__.py
│ └── routes.py
└── __init__.py
这样后期加功能,不会把 app.py 撑成几千行。你想想看,一个文件里找路由,翻半天,多痛苦。
4.4 Jieba分词:中文搜索的灵魂
英文搜索按空格分词就行。中文呢?「我爱北京天安门」——怎么切?
Jieba 就是干这个的。它有三种模式:
- 精确模式:最常用,把句子最精确地切开
- 全模式:把所有可能的词都列出来,速度快但有冗余
- 搜索引擎模式:在精确模式基础上,对长词再切分
项目里怎么用?
咱们会在 Elasticsearch 的 IK 分词器 里集成 Jieba 的词典。这样索引和搜索时,都用同一套分词逻辑。我曾经遇到一个问题:索引时用 Jieba,搜索时用默认分词器,结果「笔记本电脑」搜不到「笔记本」。嗯,从那以后,我坚持索引和搜索用同一套分词配置。
4.5 Docker部署:一次构建,到处跑
最后说说 Docker。为什么必须用?
你想想看:你的电脑是 Mac,Elasticsearch 跑在 Linux 容器里。没有 Docker,你得手动装 Java、配环境变量、调内核参数……搞不好还得重装系统。
用 Docker,一个 docker-compose.yml 搞定所有:
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.10.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
ports:
- "9200:9200"
flask-app:
build: .
ports:
- "5000:5000"
depends_on:
- elasticsearch
我的经验:开发时,把 Elasticsearch 的数据目录挂载到本地。这样重启容器,数据不会丢。命令是 volumes: - ./es_data:/usr/share/elasticsearch/data。
4.6 技术栈总结
好,咱们捋一下:
| 组件 | 版本 | 作用 |
|---|---|---|
| Python | 3.10+ | 主编程语言 |
| Elasticsearch | 8.x | 搜索引擎核心 |
| Flask | 2.x | Web 框架 |
| Jieba | 0.42+ | 中文分词 |
| Docker | 24+ | 容器化部署 |
这五个组件,就是咱们搜索引擎的「五脏六腑」。下一章,我会带你亲手搭建开发环境。到时候,咱们把 Docker 跑起来,让 Elasticsearch 和 Flask 真正「活」过来。
嗯,准备好了吗?