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 真正「活」过来。

嗯,准备好了吗?