Elasticsearch基础知识
Elasticsearch 是一个分布式的搜索引擎,能够快速地存储、搜索和分析大量数据。它使用基于Lucene 的倒排索引实现搜索,支持分布式、高可用、实时搜索等特性。Elasticsearch 被广泛运用于数据分析、全文搜索、安全信息与事件管理等方面。本文将从基础、安装、倒排索引、优化、数据导入、详细操作、常用命令、工作模式、集群、分片等角度来介绍 Elasticsearch。
一、基础
Elasticsearch 是一个基于 Lucene 的搜索引擎,其主要特点如下:
- 分布式:可以将数据分批处理并分配到不同的节点上,提高查询性能。
- 高可用性:可以对数据进行备份和恢复,保证数据的可靠性。
- 实时搜索:可以对实时数据进行处理并进行搜索。
- 多样化的查询语言:可以使用 RESTAPI 或者各种语言的客户端库来查询数据。
二、安装
Linux 安装
下载 Elasticsearch 的压缩包:wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.3-linux-x86_64.tar.gz
解压:tar -zxvf elasticsearch-7.13.3-linux-x86_64.tar.gz
进入 Elasticsearch 解压目录,修改 config/elasticsearch.yml 文件,设置集群名称和节点名称:
cluster.name: my-application
node.name: node-1
- 设置 Elasticsearch 的 JVM 内存大小:
-Xms1g
-Xmx1g
- 启动 Elasticsearch:
./bin/elasticsearch
Yum 安装
- 添加 Elasticsearch 的 yum 源:
sudo rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
sudo vim /etc/yum.repos.d/elasticsearch.repo
将以下内容复制到 /etc/yum.repos.d/elasticsearch.repo 文件中:
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
- 安装 Elasticsearch:
sudo yum install elasticsearch
- 启动 Elasticsearch:
sudo systemctl start elasticsearch
Docker 安装
- 拉取 Elasticsearch 镜像:
docker pull elasticsearch:7.13.3
- 运行 Elasticsearch 容器:
docker run -d \
--name elasticsearch \
-p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
elasticsearch:7.13.3
三、倒排索引
Elasticsearch 的搜索基于倒排索引实现。倒排索引是一种数据结构,将文档中的每一个词(term)与包含这个词的文档(document)进行映射。倒排索引由两部分组成:词典和倒排表。
- 词典:存储所有不重复的词,每个词有一个编号或者指针。
- 倒排表:存储每个词在哪些文档出现过以及在文档中出现的位置信息。
当我们搜索一个词时,只需要查找该词在倒排表中出现的文档即可,这样就避免了对全文进行扫描,大大提高了搜索效率。
四、优化
对于大型的 Elasticsearch 索引,我们需要通过一些优化手段来提高查询性能。
- 优化硬件:增加 CPU、内存、磁盘等硬件资源,提高处理能力。
- 集群化:将索引分散到不同的节点上进行处理,提高查询性能。
- 索引分片:将索引分成多个分片,每个分片独立处理,提高并发能力。
- 索引副本:将索引副本分配到不同节点上,提高查询性能和容错能力。
- 预热缓存:将 Elasticsearch 的热缓存预热,提高查询性能。
五、数据导入
Elasticsearch 支持多种数据导入方式:
- 使用 Bulk API 批量导入数据。
- 使用 Logstash 工具导入数据。
- 使用 Filebeat 工具监控日志文件并导入数据。
以下是通过 Bulk API 批量导入数据的示例:
- 创建一个包含两个文档的 JSON 文件 data.json:
{"index":{"_index":"myindex","_type":"mytype","_id":"1"}}
{"name":"John Doe","age":25,"address":"New York"}
{"index":{"_index":"myindex","_type":"mytype","_id":"2"}}
{"name":"Jane Doe","age":32,"address":"Paris"}
- 使用 curl 命令导入数据:
curl -H "Content-Type: application/x-ndjson" -XPOST "localhost:9200/_bulk?pretty" --data-binary "@data.json"
六、详细操作
以下是 Elasticsearch 的一些详细操作:
- 创建索引:
PUT /myindex
- 添加文档:
PUT /myindex/mytype/1
{
"name": "John Doe",
"age": 25,
"address": "New York"
}
- 获取文档:
GET /myindex/mytype/1
- 修改文档:
POST /myindex/mytype/1/_update
{
"doc": {
"age": 27
}
}
- 删除文档:
DELETE /myindex/mytype/1
七、常用命令
以下是 Elasticsearch 的一些常用命令:
- 查看健康状况:
GET /_cat/health
- 查看节点:
GET /_cat/nodes
- 查看索引:
GET /_cat/indices
- 查看分片信息:
GET /_cat/shards
八、工作模式
Elasticsearch 支持三种工作模式:
- 单节点模式:单个 Elasticsearch 实例运行在单个节点上。
- 集群模式:多个 Elasticsearch 节点组成集群,可以在多个节点上运行多个 Elasticsearch 实例,并进行数据分片和负载均衡。
- 分布式模式:将多个 Elasticsearch 集群分布在不同的数据中心,提高并发性和可用性。
九、集群
Elasticsearch 集群由多个节点组成,可以通过以下步骤创建集群:
- 配置 Elasticsearch 集群名称以及节点名称。
cluster.name: my-application
node.name: node-1
- 设置节点之间的通信协议。
network.host: 192.168.0.1
- 添加节点到集群。
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": "all"
}
}
十、分片
Elasticsearch 索引可以分成多个分片,每个分片独立存储索引的一部分数据,并可以分配到不同的节点进行处理。分片可以提供以下好处:
- 提高查询性能:可以将查询结果从不同节点汇总,提高查询速度。
- 提高容错能力:当某个节点出现故障时,可以使用其他节点上保存的副本来恢复数据。
- 提高并发处理能力:可以将请求分发到多个节点上进行并发处理。
Elasticsearch 分片的数量需要在创建索引时进行指定,一旦创建后就不能修改。如果需要修改分片数量,需要先删除索引,重新创建索引并指定新的分片数量。因此,在创建索引时需要谨慎考虑分片数量的设置,避免后续需要频繁修改分片数量。
全部评论