一、Elasticsearch 简介
Elasticsearch 是一个开源的分布式搜索和分析引擎,它基于 Apache Lucene 构建,提供了一个分布式、多租户的全文搜索引擎,具有高可扩展性、高可用性等特点,广泛应用于日志分析、全文检索、大数据分析等领域。
二、基础环境搭建
2.1 安装 Java
Elasticsearch 是用 Java 编写的,所以需要先安装 Java 环境。以 Linux 系统为例,使用以下命令安装 OpenJDK 11:
sudo apt-get update
sudo apt-get install openjdk-11-jdk
安装完成后,使用 java -version
命令验证安装是否成功。
2.2 下载并安装 Elasticsearch
从 Elasticsearch 官方网站(https://www.elastic.co/downloads/elasticsearch)下载适合你系统的安装包,解压后进入 Elasticsearch 目录。例如,在 Linux 系统上:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.6-linux-x86_64.tar.gz
tar -xzf elasticsearch-7.17.6-linux-x86_64.tar.gz
cd elasticsearch-7.17.6
2.3 启动 Elasticsearch
在 Elasticsearch 目录下,使用以下命令启动 Elasticsearch:
./bin/elasticsearch
如果要在后台运行,可以使用:
./bin/elasticsearch -d
2.4 验证安装
打开浏览器,访问 http://localhost:9200
,如果看到类似以下的 JSON 响应,说明 Elasticsearch 安装并启动成功:
{
"name" : "node-1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "abcdef123456",
"version" : {
"number" : "7.17.6",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "1234567890abcdef",
"build_date" : "2023-05-12T02:26:06.621376232Z",
"build_snapshot" : false,
"lucene_version" : "8.11.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
三、基本概念
3.1 索引(Index)
索引是 Elasticsearch 中存储数据的逻辑容器,类似于关系型数据库中的数据库。一个 Elasticsearch 集群可以包含多个索引。例如,我们可以创建一个名为 products
的索引来存储商品信息。
3.2 类型(Type)
在 Elasticsearch 7.x 及以后的版本中,类型的概念已被废弃,一个索引中不再区分多种类型。但在早期版本中,类型类似于关系型数据库中的表。
3.3 文档(Document)
文档是 Elasticsearch 中存储的基本数据单元,类似于关系型数据库中的一行记录。文档以 JSON 格式表示。例如:
{
"id": 1,
"name": "iPhone 14",
"price": 999,
"description": "A great smartphone"
}
3.4 分片(Shard)
索引可以被分成多个分片,每个分片是一个独立的 Lucene 索引。分片可以分布在不同的节点上,从而实现数据的分布式存储和并行处理。例如,一个索引可以被分成 5 个主分片。
3.5 副本(Replica)
为了提高数据的可用性和容错性,每个主分片可以有多个副本分片。副本分片是主分片的复制,分布在不同的节点上。例如,每个主分片可以有 1 个副本分片。
四、基本操作
4.1 创建索引
使用以下命令创建一个名为 products
的索引:
curl -X PUT "localhost:9200/products?pretty"
pretty
参数用于格式化输出。
4.2 插入文档
使用以下命令向 products
索引中插入一个文档:
curl -X POST "localhost:9200/products/_doc?pretty" -H 'Content-Type: application/json' -d'
{
"id": 1,
"name": "iPhone 14",
"price": 999,
"description": "A great smartphone"
}
'
4.3 查询文档
使用以下命令查询 products
索引中的所有文档:
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}
'
match_all
查询用于匹配索引中的所有文档。
4.4 更新文档
使用以下命令更新 products
索引中 id
为 1 的文档的 price
字段:
curl -X POST "localhost:9200/products/_update/1?pretty" -H 'Content-Type: application/json' -d'
{
"doc": {
"price": 1099
}
}
'
4.5 删除文档
使用以下命令删除 products
索引中 id
为 1 的文档:
curl -X DELETE "localhost:9200/products/_doc/1?pretty"
五、面试题及答案
5.1 基础概念类
- 问题:什么是 Elasticsearch?
- 答案: Elasticsearch 是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建,提供了分布式、多租户的全文搜索功能,具有高可扩展性、高可用性等特点,广泛应用于日志分析、全文检索、大数据分析等领域。
- 问题:请解释 Elasticsearch 中的索引、文档和分片的概念。
- 答案:
- 索引:是 Elasticsearch 中存储数据的逻辑容器,类似于关系型数据库中的数据库。
- 文档:是 Elasticsearch 中存储的基本数据单元,以 JSON 格式表示,类似于关系型数据库中的一行记录。
- 分片:索引可以被分成多个分片,每个分片是一个独立的 Lucene 索引,分片可以分布在不同的节点上,实现数据的分布式存储和并行处理。
- 答案:
5.2 操作类
- 问题:如何在 Elasticsearch 中创建一个索引?
- 答案: 可以使用
PUT
请求来创建索引。例如,使用curl
命令:curl -X PUT "localhost:9200/my_index?pretty"
可以创建一个名为my_index
的索引。
- 答案: 可以使用
- 问题:如何向 Elasticsearch 中插入一个文档?
- 答案: 可以使用
POST
请求向指定索引插入文档。例如:
- 答案: 可以使用
curl -X POST "localhost:9200/my_index/_doc?pretty" -H 'Content-Type: application/json' -d'
{
"field1": "value1",
"field2": "value2"
}
'
5.3 原理类
- 问题:Elasticsearch 是如何实现分布式存储的?
- 答案: Elasticsearch 通过分片机制实现分布式存储。一个索引可以被分成多个主分片,每个主分片可以有多个副本分片。主分片和副本分片可以分布在不同的节点上,当有新的数据写入时,数据会被分散存储在各个主分片上,副本分片会同步主分片的数据,从而实现数据的分布式存储和高可用性。
- 问题:Elasticsearch 中的查询是如何执行的?
- 答案: 当执行一个查询时,Elasticsearch 会将查询请求发送到所有相关的分片上,每个分片会在本地执行查询并返回结果。然后,这些结果会被汇总到一个节点上进行合并和排序,最终返回给客户端。
5.4 性能和优化类
- 问题:如何优化 Elasticsearch 的性能?
- 答案: 可以从以下几个方面进行优化:
- 合理设置分片和副本数量,避免分片过多或过少。
- 优化查询语句,避免使用复杂的查询和全量扫描。
- 定期清理无用的数据,控制索引的大小。
- 优化硬件资源,如增加内存、使用 SSD 等。
- 答案: 可以从以下几个方面进行优化:
- 问题:Elasticsearch 中出现慢查询如何处理?
- 答案: 可以采取以下措施:
- 使用 Elasticsearch 的慢查询日志功能,找出慢查询的具体语句。
- 分析慢查询的原因,如是否使用了复杂的查询、是否进行了全量扫描等。
- 对查询语句进行优化,如使用更合适的查询类型、添加过滤条件等。
- 检查索引的设置和数据分布情况,是否需要调整分片和副本数量。
- 答案: 可以采取以下措施: