1. 介绍

Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库—无论是开源还是私有。

但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理。Lucene 非常 复杂。

Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。

然而,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容:

  • 一个分布式的实时文档存储,每个字段 可以被索引与搜索
  • 一个分布式实时分析搜索引擎
  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据

Elasticsearch 将所有的功能打包成一个单独的服务,这样你可以通过程序与它提供的简单的 RESTful API 进行通信, 可以使用自己喜欢的编程语言充当 web 客户端,甚至可以使用命令行(去充当这个客户端)。

就 Elasticsearch 而言,起步很简单。对于初学者来说,它预设了一些适当的默认值,并隐藏了复杂的搜索理论知识。 它 开箱即用 。只需最少的理解,你很快就能具有生产力。

2. 在Docker中部署一个ElasticSearch单节点实例

接下来,我们需要在Docker中启动一个ElasticSearch单节点实例。方便我们学习。

2.1 拉取镜像

1
2
3
4
5
# 根据不同架构选择版本
# amd64
docker pull amd64/elasticsearch:7.11.2
# arm64
docker pull arm64v8/elasticsearch:7.11.2

2.2 编写docker-compose.yml

  • 创建一个工作目录,用来存放持久化数据和docker-compose.yml文件。
1
mkdir ~/Docker/elasticsearch
  • 创建docker-compose.yml
1
vim ~/Docker/elasticsearch/docker-compose.yml
  • 输入以下配置
1
2
3
4
5
6
7
8
9
10
11
12
version: "3.8"
services:
elasticsearch:
image: arm64v8/elasticsearch:7.11.2 #指定使用的镜像
container_name: elasticsearch #指定容器名称
ports: #映射端口
- "9200:9200"
- "9300:9300"
environment:
- "discovery.type=single-node" #设置单节点模式
volumes:
- ./data:/usr/share/elasticsearch/data #挂载数据文件夹到宿主机

2.3 运行

1
docker compose up -d

2.4 查看启动正常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
> curl http://localhost:9200
{
"name" : "d9fb9c159de4",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "v8cYuynUT8iHZBQH-IjY9Q",
"version" : {
"number" : "7.11.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "3e5a16cfec50876d20ea77b075070932c6464c7d",
"build_date" : "2021-03-06T05:54:38.141101Z",
"build_snapshot" : false,
"lucene_version" : "8.7.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}

3. 面向文档

在应用程序中对象很少只是一个简单的键和值的列表。通常,它们拥有更复杂的数据结构,可能包括日期、地理信息、其他对象或者数组等。

也许有一天你想把这些对象存储在数据库中。使用关系型数据库的行和列存储,这相当于是把一个表现力丰富的对象塞到一个非常大的电子表格中:为了适应表结构,你必须设法将这个对象扁平化—通常一个字段对应一列—而且每次查询时又需要将其重新构造为对象。

Elasticsearch 是 面向文档 的,意味着它存储整个对象或 文档。Elasticsearch 不仅存储文档,而且 索引 每个文档的内容,使之可以被检索。在 Elasticsearch 中,我们对文档进行索引、检索、排序和过滤—而不是对行列数据。这是一种完全不同的思考数据的方式,也是 Elasticsearch 能支持复杂全文检索的原因。

Elasticsearch 使用 JavaScript Object Notation(或者 JSON)作为文档的序列化格式。JSON 序列化为大多数编程语言所支持,并且已经成为 NoSQL 领域的标准格式。 它简单、简洁、易于阅读。

下面这个 JSON 文档代表了一个 user 对象:

1
2
3
4
5
6
7
8
9
10
11
{
"email": "john@smith.com",
"first_name": "John",
"last_name": "Smith",
"info": {
"bio": "Eco-warrior and defender of the weak",
"age": 25,
"interests": [ "dolphins", "whales" ]
},
"join_date": "2014/05/01"
}

虽然原始的 user 对象很复杂,但这个对象的结构和含义在 JSON 版本中都得到了体现和保留。在 Elasticsearch 中将对象转化为 JSON 后构建索引要比在一个扁平的表结构中要简单的多。