Elasticsearch基础知识

2023-04-01 16:56
1890
0

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
  1. 设置 Elasticsearch 的 JVM 内存大小:
-Xms1g
-Xmx1g
  1. 启动 Elasticsearch:
./bin/elasticsearch

Yum 安装

  1. 添加 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
  1. 安装 Elasticsearch:
sudo yum install elasticsearch
  1. 启动 Elasticsearch:
sudo systemctl start elasticsearch

Docker 安装

  1. 拉取 Elasticsearch 镜像:
docker pull elasticsearch:7.13.3
  1. 运行 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 批量导入数据的示例:

  1. 创建一个包含两个文档的 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"}
  1. 使用 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 集群由多个节点组成,可以通过以下步骤创建集群:

  1. 配置 Elasticsearch 集群名称以及节点名称。
cluster.name: my-application
node.name: node-1
  1. 设置节点之间的通信协议。
network.host: 192.168.0.1
  1. 添加节点到集群。
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.enable": "all"
  }
}

十、分片

Elasticsearch 索引可以分成多个分片,每个分片独立存储索引的一部分数据,并可以分配到不同的节点进行处理。分片可以提供以下好处:

  • 提高查询性能:可以将查询结果从不同节点汇总,提高查询速度。
  • 提高容错能力:当某个节点出现故障时,可以使用其他节点上保存的副本来恢复数据。
  • 提高并发处理能力:可以将请求分发到多个节点上进行并发处理。

Elasticsearch 分片的数量需要在创建索引时进行指定,一旦创建后就不能修改。如果需要修改分片数量,需要先删除索引,重新创建索引并指定新的分片数量。因此,在创建索引时需要谨慎考虑分片数量的设置,避免后续需要频繁修改分片数量。

全部评论