[[Elasticsearch]] 是一款基于 [[Lucene]] 的开源的、分布式的搜索引擎。提供一个分布式、多租户的全文搜索引擎。提供 HTTP Web 界面和 JSON 格式接口。

Elasticsearch 由 Java 实现,是目前最流行的大数据存储、搜索和分析引擎。

GitHub:https://github.com/elastic/elasticsearch

大数据要解决三个问题:

  • 存储
    • 传统关系型数据库 MySQL,Oracle 遇到瓶颈,Google 提出 Map/Reduce 和 Google File System,Hadoop 作为开源实现在业界得到应用,但 Hadoop 存储无法实现数据实时检索和计算
  • 检索
    • [[Apache Hive]] 作为在 Hadoop 基础之上的数据仓库提供了查询分析的能力
  • 展现

但 Elasticsearch + Kibana 的组合可以快速解决如上提到的问题。

Elasticsearch 是面向文档的,存储整个文档或对象,内部使用 JSON 作为文档序列化格式。

installation

在使用 Linux 安装之前设置 vm.max_map_count 至少是 262144.

使之生效:

sudo sysctl -w vm.max_map_count=262144

让系统重启之后也生效,需要编辑 /etc/sysctl.conf 添加一行:

vm.max_map_count=262144

通过 docker-compose 安装。

也可以下载手动安装

我个人推荐在本地使用单节点安装启用

默认情况,Elasticsearch 通过 9200 端口对外提供 REST API。Kibana 的默认端口是 5601。

如果遇到如下问题,请查看是否设置了 vm.max_map_count

es03_1 ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.

Single node

单节点的 Elasticsearch 可以使用 Docker 在本地启用,参考这里

常用命令:

docker network create elastic
docker run --name es --net elastic -p 9200:9200 -p 9300:9300 -it docker.elastic.co/elasticsearch/elasticsearch:8.3.1
docker exec -it es /usr/share/elasticsearch/bin/elasticsearch-reset-password

概念

Node

Node,节点,Elasticsearch 运行实例,集群由多个节点组成。节点存储数据,并参与集群索引、搜索和分析。

Shard

Shard, 分片,数据中的一小部分,每一个分片是一个独立的 Lucene 实例,自身也是一个完整的搜索引擎。

索引会存储大量的数据,这些数据会超出单个节点的硬件限制,例如,占用 1TB 磁盘空间的 10 亿个文档的单个索引可能超出单个节点的磁盘容量,所以 Elasticsearch 提供了索引水平切分(Shard 分片)能力。

创建索引时只需要定义所需分片数量。每一个分片本身就是一个具有完全功能的独立「索引」,可以分布在集群中的任何节点上。

文档会被存储并被索引在分片中。但是当我们使用程序与其通信时,不会直接与分片通信,而是通过索引。

当集群扩容或缩小时,Elasticsearch 会自动在节点之间迁移分配分片。

分片分为:

  • 主分片 primary shard
  • 从分片 replica shard

从分片是主分片的副本,提供数据的冗余副本,在硬件故障时提供数据保护,同时服务于搜索和检索只读请求。

索引中主分片的数量在索引创建之后就固定了,但是从分片数量可以随时改变。

设置三个主分片和一组从分片

PUT /blogs
{
    "settings" : {
        "number_of_shards" : 3,
        "number_of_replicas" : 1
    }
}

分片很重要:

  • 分片可以水平拆分数据,实现大数据存储和分析
  • 跨分片进行分发和并行操作,提高性能和吞吐量

Index

Index, 索引。在 Elasticsearch 中,存储数据的行为叫做索引 Indexing,在索引数据值前,要决定数据存储在哪里。

单个集群中可以定义任意多索引。

一个 Elasticsearch 集群可以包含多个索引(数据库),可以包含很多类型(表),类型中可以包含很多文档(行),文档中包含很多字段(列)。

关系数据库  -> 数据库 -> 表 -> 行 -> 列 (column)
Elasticsearch -> 索引 -> 类型 -> 文档 -> 字段(field)

在 Elasticsearch 中索引有不同的含义。

作为名词

索引就是 Elasticsearch 提供的「数据库」。

作为动词

为文档创建索引,就是将文档存储到索引(数据库)中的过程,只有建立了索引才能被检索。

反向索引

在关系型数据库中为某一列添加索引,是在文件结构中使用 B-Tree 加速查询。在 Elasticsearch 和 Lucene 中使用 Inverted index (反向索引)的结构来实现相同的功能。

通常文档中的每一个字段都被创建了索引(有一个反向索引)

创建索引

假如要创建员工名单:

PUT /corp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
  • 为每一个员工文档创建索引
  • 文档被标记为 employee 类型
  • 这个类型会存放在 corp 索引中

Document

Document 文档,可被索引的基本信息单元。文档以 JSON 表示。单个索引理论上可以存储任意多的文档。

副本

副本在分片或节点发生故障时提供高可用。

分片和对应的副本不可在同一个节点上

副本机制,可以提高搜索性能和水平扩展吞吐量,因为可以在所有副本上并行搜索。

默认情况下,Elasticsearch 中的每个索引都分配一个主分片和一个副本。集群至少需要有两个节点,索引将有一个主分片和一个完整副本。

Query DSL 搜索

Elasticsearch 提供了灵活的查询语言,可以完成更加复杂的搜索任务。

使用 JSON 作为主体:

GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}

Aggregation

Elasticsearch 有一项功能叫做 Aggregation,类似于 GROUP BY,但是更强大。结合查询语句可以实现非常多的聚合操作。

分布式

Elasticsearch 可以被扩展到上百成千台服务器来处理 PB 级别的数据。Elasticsearch 是分布式的。用户在使用的过程中不需要考虑到分片,集群等等,这些都是 Elasticsearch 自动完成的:

  • 将文档分区到不同的容器,分片中
  • 跨节点平衡集群中节点间的索引和搜索负载
  • 自动复制数据提供冗余副本,防止硬件错误造成数据丢失
  • 自动在节点之间路由
  • 无缝扩展或恢复集群

集群健康状态查询:

GET /_cluster/health
{
"cluster_name": "elasticsearch",
"status": "green", <1>
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 0,
"active_shards": 0,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
}

其中 status 有三个状态:

  • green 主分片和从分片都可以用
  • yellow 主分片可用,但存在从分片不可用
  • red 存在不可用的主分片

使用

集群健康状况:

GET /_cat/health?v

列出节点信息:

GET /_cat/nodes?v

列出集群中索引信息:

GET /_cat/indices?v

创建索引:

PUT /customer?pretty
GET /_cat/indices?v