当前位置:首页>python>每日Python面试题 · 第8期

每日Python面试题 · 第8期

  • 2026-09-02 16:37:17
每日Python面试题 · 第8期

1. Elasticsearch 是什么?主要应用场景有哪些?

答案

Elasticsearch(ES)是一个基于 Lucene 的分布式搜索和分析引擎。

主要应用场景:

  • 日志检索(ELK)
  • 商品搜索
  • 全文检索
  • 数据分析
  • 实时监控
  • BI报表统计

特点:

  • 分布式
  • 高性能
  • RESTful API
  • 全文搜索能力强
  • 支持聚合分析

2. Elasticsearch 和 MySQL 的区别是什么?

答案

MySQL
Elasticsearch
关系型数据库
搜索引擎
支持事务
不支持事务
SQL查询
DSL查询
适合增删改查
适合搜索分析
强一致性
近实时(NRT)

实际项目中:

MySQL负责存储Elasticsearch负责搜索

通常两者配合使用。


3. Elasticsearch 为什么查询速度快?

答案

因为 Elasticsearch 底层使用 Lucene 的倒排索引。

传统数据库:

关键词 → 遍历所有记录

倒排索引:

北京 → doc1 doc2 doc5上海 → doc3 doc8

查询时直接定位文档。

时间复杂度远低于全表扫描。


4. 什么是倒排索引?

答案

例如有两个文档:

doc1: 我爱北京doc2: 我爱上海

建立倒排索引后:

我 → doc1 doc2爱 → doc1 doc2北京 → doc1上海 → doc2

搜索“北京”时直接找到 doc1。

这就是 ES 查询快的核心原因。


5. Elasticsearch 中 Index、Document、Field 分别是什么?

答案

类比 MySQL:

MySQL
Elasticsearch
Database
Index
Row
Document
Column
Field

示例:

{  "name":"Tom",  "age":20}

整个 JSON 是一个 Document。

其中:

nameage

属于 Field。


6. Python 如何连接 Elasticsearch?

题目

from elasticsearch import Elasticsearches=Elasticsearch("http://localhost:9200",basic_auth=("elastic","admin"))

这段代码的作用是什么?

答案

作用:

  • 创建 Elasticsearch 客户端
  • 指定连接地址
  • 使用用户名密码认证

连接成功后即可执行:

es.search()es.index()es.delete()

等操作。


7. 如何判断 Elasticsearch 是否连接成功?

答案

if es.ping():    print("连接成功")else:    print("连接失败")

ping() 返回:True

表示连接正常。

返回:False

说明:

  • ES未启动
  • IP错误
  • 端口错误
  • 用户名密码错误

8. ping() 返回 False 怎么排查?

答案

排查步骤:

① 查看容器是否启动

docker ps

② 查看日志

docker logs elasticsearch

③ 检查端口

netstat -an | grep9200

④ 测试接口

curl http://localhost:9200

⑤ 检查认证信息

basic_auth=("elastic","admin")

是否正确。


9. 如何创建索引?

题目

es.indices.create(index="user")

答案

作用:

创建一个名为 user 的索引。

类似 MySQL:

CREATE DATABASE user;

执行成功后:

user

索引会出现在 ES 中。


10. ignore=400 的作用是什么?

题目

es.indices.create(    index="user",    ignore=400)

答案

400 表示:

索引已存在

加入:

ignore=400

后不会抛异常。

避免出现:

resource_already_exists_exception

错误。


11. 如何插入文档?

题目

doc = {    "name":"Tom",    "age":20}es.index(    index="user",    document=doc)

答案

作用:

向 user 索引写入一条数据。

最终存储:{"name":"Tom", "age":20}

作为一个 Document。


12. index() 和 create() 的区别?

答案

index()

es.index()

特点:

  • 存在则覆盖
  • 不存在则创建

create()

es.create()

特点:

  • 存在则报错
  • 不会覆盖

面试高频考点。


13. 如何根据 ID 查询文档?

答案

res = es.get(    index="user",    id="1")

返回:

{  "_id":"1",  "_source":{      "name":"Tom"  }}

用于查询单条数据。


14. 如何删除文档?

答案

es.delete(    index="user",    id="1")

作用:

删除指定 ID 的文档。

执行成功:

{  "result": "deleted"}

15. match 查询和 term 查询有什么区别?

答案

match:

{  "match":{    "name":"北京大学"  }}

会分词:

北京大学

term:

{  "term":{    "name":"北京大学"  }}

不会分词。

必须完全匹配。

总结:

match → 全文检索term → 精确匹配

16. match_phrase 和 match 有什么区别?

答案

文档:

我爱北京天安门

match:

北京 天安门

顺序无所谓。

match_phrase:

北京 天安门

顺序必须一致。

因此:

match_phrase 更严格

17. 如何查询所有数据?

答案

{  "query":{    "match_all":{}  }}

Python:

res = es.search(    index="user",    query={        "match_all":{}    })

返回全部文档。


18. bool 查询有哪些条件?

答案

常用四种:

{  "bool":{      "must":[],      "should":[],      "must_not":[],      "filter":[]  }}

说明:

条件
含义
must
必须满足
should
应该满足
must_not
必须不满足
filter
过滤

19. Bulk 批量写入有什么优势?

答案

普通写入:

for item in data:    es.index(...)

会产生大量 HTTP 请求。

Bulk:

bulk(es, actions)

优势:

  • 减少网络开销
  • 提高写入性能
  • 减少CPU消耗

适合:

日志系统数据同步大批量导入

20. 什么是 Mapping?

答案

Mapping 相当于 MySQL 表结构。

例如:

{  "properties":{      "name":{          "type":"text"      },      "age":{          "type":"integer"      }  }}

定义:

  • 字段名称
  • 字段类型
  • 分词规则

21. text 和 keyword 的区别?

答案

text:

{  "type":"text"}

特点:

  • 支持分词
  • 支持全文检索

适用于:

文章内容评论内容商品描述

keyword:

{  "type":"keyword"}

特点:

  • 不分词
  • 精确匹配

适用于:

手机号订单号身份证号用户名

22. 什么是分片(Shard)?

答案

例如:

100GB 数据

放一台机器压力太大。

ES会拆分:

Shard1Shard2Shard3Shard4Shard5

分散到多个节点存储。

优点:

  • 提升性能
  • 支持水平扩展

23. 主分片和副本分片有什么区别?

答案

Primary Shard:

  • 真正存储数据
  • 写请求入口

Replica Shard:

  • 主分片备份
  • 提供查询能力
  • 故障恢复

例如:

Primary 1份Replica 2份

总共有:

3份数据

24. 分片越多越好吗?

答案

不是。

分片太多:

占内存占CPU管理成本高

分片太少:

扩展困难查询慢

最佳方案:

根据数据量规划。

经验:

单分片20~50GB

比较合理。


25. 为什么 Elasticsearch 不适合做 Join?

答案

因为:

  • 数据分布在多个节点
  • Join需要跨节点计算
  • 查询代价极高

ES设计目标:

搜索分析聚合

不是关系型数据库。

因此:

能不Join就不Join

26. 什么是 Near Real Time(NRT)?

答案

Near Real Time:

近实时

不是实时。

写入流程:

Document ↓Memory Buffer ↓Refresh ↓Segment ↓可搜索

默认 Refresh:

1秒

所以:

写入成功≠立即搜索到

27. Elasticsearch 集群变红(Red)怎么办?

答案

排查顺序:

查看集群状态:

GET _cluster/health

查看分片:

GET _cat/shards?v

查看节点:

GET _cat/nodes?v

检查:

  • 节点是否掉线
  • 磁盘是否满
  • 副本是否分配失败

28. 日志量每天几千万条,如何优化?

答案

方案:

① 使用 Bulk 写入

② 按天创建索引

log-2026-06-25

③ 配置 ILM 生命周期

④ 合理规划分片

⑤ 使用冷热数据架构

⑥ 增加 ES 节点


29. Elasticsearch 和 MySQL 如何配合?

答案

典型架构:

MySQL   ↓Canal   ↓Kafka   ↓Elasticsearch

职责:

MySQL:

事务存储强一致

Elasticsearch:

搜索统计分析

30. Elasticsearch 最常见的线上问题有哪些?

答案

① 分片过多

导致:

CPU飙高内存不足

② 动态 Mapping 爆炸

导致:

字段数过万

③ Bulk 写入过大

导致:

OOM

④ update_by_query 滥用

导致:

CPU 100%

⑤ 查询 DSL 写得太复杂

导致:

响应超时

面试总结口诀:

ES三板斧:倒排索引查得快,Mapping设计要提前,分片规划是关键。搜索用 Match,精确用 Term,批量写入用 Bulk,线上排障看 Shard。

最新文章

随机文章