1. Elasticsearch 是什么?主要应用场景有哪些?
答案
Elasticsearch(ES)是一个基于 Lucene 的分布式搜索和分析引擎。
主要应用场景:
特点:
2. Elasticsearch 和 MySQL 的区别是什么?
答案
实际项目中:
MySQL负责存储Elasticsearch负责搜索
通常两者配合使用。
3. Elasticsearch 为什么查询速度快?
答案
因为 Elasticsearch 底层使用 Lucene 的倒排索引。
传统数据库:
倒排索引:
北京 → doc1 doc2 doc5上海 → doc3 doc8
查询时直接定位文档。
时间复杂度远低于全表扫描。
4. 什么是倒排索引?
答案
例如有两个文档:
建立倒排索引后:
我 → doc1 doc2爱 → doc1 doc2北京 → doc1上海 → doc2
搜索“北京”时直接找到 doc1。
这就是 ES 查询快的核心原因。
5. Elasticsearch 中 Index、Document、Field 分别是什么?
答案
类比 MySQL:
示例:
{ "name":"Tom", "age":20}
整个 JSON 是一个 Document。
其中:
属于 Field。
6. Python 如何连接 Elasticsearch?
题目
from elasticsearch import Elasticsearches=Elasticsearch("http://localhost:9200",basic_auth=("elastic","admin"))
这段代码的作用是什么?
答案
作用:
连接成功后即可执行:
es.search()es.index()es.delete()
等操作。
7. 如何判断 Elasticsearch 是否连接成功?
答案
if es.ping(): print("连接成功")else: print("连接失败")
ping() 返回:True
表示连接正常。
返回:False
说明:
8. ping() 返回 False 怎么排查?
答案
排查步骤:
① 查看容器是否启动
② 查看日志
docker logs elasticsearch
③ 检查端口
④ 测试接口
curl http://localhost:9200
⑤ 检查认证信息
basic_auth=("elastic","admin")
是否正确。
9. 如何创建索引?
题目
es.indices.create(index="user")
答案
作用:
创建一个名为 user 的索引。
类似 MySQL:
执行成功后:
索引会出现在 ES 中。
10. ignore=400 的作用是什么?
题目
es.indices.create( index="user", ignore=400)
答案
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()
特点:
create()
特点:
面试高频考点。
13. 如何根据 ID 查询文档?
答案
res = es.get( index="user", id="1")
返回:
{ "_id":"1", "_source":{ "name":"Tom" }}
用于查询单条数据。
14. 如何删除文档?
答案
es.delete( index="user", id="1")
作用:
删除指定 ID 的文档。
执行成功:
15. match 查询和 term 查询有什么区别?
答案
match:
{ "match":{ "name":"北京大学" }}
会分词:
term:
{ "term":{ "name":"北京大学" }}
不会分词。
必须完全匹配。
总结:
16. match_phrase 和 match 有什么区别?
答案
文档:
match:
顺序无所谓。
match_phrase:
顺序必须一致。
因此:
17. 如何查询所有数据?
答案
{ "query":{ "match_all":{} }}
Python:
res = es.search( index="user", query={ "match_all":{} })
返回全部文档。
18. bool 查询有哪些条件?
答案
常用四种:
{ "bool":{ "must":[], "should":[], "must_not":[], "filter":[] }}
说明:
19. Bulk 批量写入有什么优势?
答案
普通写入:
for item in data: es.index(...)
会产生大量 HTTP 请求。
Bulk:
优势:
适合:
20. 什么是 Mapping?
答案
Mapping 相当于 MySQL 表结构。
例如:
{ "properties":{ "name":{ "type":"text" }, "age":{ "type":"integer" } }}
定义:
21. text 和 keyword 的区别?
答案
text:
特点:
适用于:
keyword:
特点:
适用于:
22. 什么是分片(Shard)?
答案
例如:
放一台机器压力太大。
ES会拆分:
Shard1Shard2Shard3Shard4Shard5
分散到多个节点存储。
优点:
23. 主分片和副本分片有什么区别?
答案
Primary Shard:
Replica Shard:
例如:
总共有:
24. 分片越多越好吗?
答案
不是。
分片太多:
分片太少:
最佳方案:
根据数据量规划。
经验:
比较合理。
25. 为什么 Elasticsearch 不适合做 Join?
答案
因为:
ES设计目标:
不是关系型数据库。
因此:
26. 什么是 Near Real Time(NRT)?
答案
Near Real Time:
不是实时。
写入流程:
Document ↓Memory Buffer ↓Refresh ↓Segment ↓可搜索
默认 Refresh:
所以:
27. Elasticsearch 集群变红(Red)怎么办?
答案
排查顺序:
查看集群状态:
查看分片:
查看节点:
检查:
28. 日志量每天几千万条,如何优化?
答案
方案:
① 使用 Bulk 写入
② 按天创建索引
③ 配置 ILM 生命周期
④ 合理规划分片
⑤ 使用冷热数据架构
⑥ 增加 ES 节点
29. Elasticsearch 和 MySQL 如何配合?
答案
典型架构:
MySQL ↓Canal ↓Kafka ↓Elasticsearch
职责:
MySQL:
Elasticsearch:
30. Elasticsearch 最常见的线上问题有哪些?
答案
① 分片过多
导致:
② 动态 Mapping 爆炸
导致:
③ Bulk 写入过大
导致:
④ update_by_query 滥用
导致:
⑤ 查询 DSL 写得太复杂
导致:
面试总结口诀:
ES三板斧:倒排索引查得快,Mapping设计要提前,分片规划是关键。搜索用 Match,精确用 Term,批量写入用 Bulk,线上排障看 Shard。