安装配置
下载最新的 ES7.X Linux版本,其内置了JDK,所以不再需要本地 JDK 环境,解压后包括以下目录:
- bin :脚本文件,包括 ES 启动 & 安装插件等等
- config : elasticsearch.yml(ES 配置文件)、jvm.options(JVM 配置文件)、日志配置文件等
- JDK : 内置的 JDK,JAVA_VERSION=”12.0.1”
- lib : 类库
- logs : 日志文件
- modules : ES 所有模块,包括 X-pack 等
- plugins : ES 已经安装的插件。默认没有插件
- data : ES 启动的时候,会有该目录,用来存储文档数据。该目录可以设置
对 config 下的各种默认配置进行一定的修改,包括 jvm.options 中 ES 使用的堆内存:1
2-Xms4g
-Xmx4g
默认使用4G的大小,请根据业务需要进行扩充,但最好不要超过32G。另外修改 elasticsearch.yml 中的 Network 与 Discovery 信息:1
2
3
4network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
由于在Linux服务器上部署,为了让其他机器也能访问到,所以将 host 配置成 0.0.0.0,注意“node-1”要换成你的服务器的名称(执行 hostname 命令可以看到)。
输入命令 ./bin/elasticsearch 就可以启动 ES,启动成功后在浏览器中输入 “ http://localhost:9200/”, 当然如果是在自己的PC上访问服务器上部署的ES,则需要将localhost换成服务器的ip地址。如果正常启动了,则会显示 cluster_name, version 等信息。
保证 ES 可以正常启动后,“Ctrl+C”终止当前任务,重新使用命令 ./bin/elasticsearch -d 将 ES 在后台运行起来,后面如果想要关闭 ES 则可以通过查询 9200 端口占用的进程,以杀掉进程的方式终止。
基本概念
从逻辑设计的角度来看,用于索引和搜索的基本单位是文档,一个或多个文档存储于索引中:
- Document(文档):可以被搜索数据的最小单位,文档会被序列化成 JSON 格式,每个文档都有一个独一无二的 _id
- Index(索引):是 Document 的容器,即一类文档的集合,复数是 Indices
ES 从 7.x 版本开始彻底废除了 Type(类型)这一概念,一个 Index 中只有一个默认的 Type,即 _doc。Type 被废弃后,类比关系型数据库 MySQL 可以这样理解: ES 实例对应 MySQL 实例中的一个 Database;Index 对应 MySQL 中的 Table;Document 对应 MySQL 中表的记录。
- Mapping(映射):类似于关系型数据库中的表结构信息,用于定义索引中字段(Field)的索引类型、分析方式、是否存储等信息。ES 中的 Mapping 是可以动态识别的,也就是说 ES 会自动根据数据格式识别它的类型,但是当需要对某些字段添加特殊属性(比如:定义分词器、是否分词、是否存储等)时,就需要手动设置 Mapping 了。一个索引的 Mapping 一旦创建,若已经存储了数据,就不可修改了
- Analyzer(分析器):定义索引中字段的分析与处理方式。一个 Analyzer 通常由一个 Tokenizer(分词器)、零到多个 Filter(过滤器) 组成
从物理设计的角度来看,一个 ES 集群(Cluster) 由一个或多个 节点(Node) 组成,一个 ES 实例就是一个节点,一个机器可以有多个实例;ES 是分布式搜索引擎,每个索引有一个或多个 分片(Shard),索引的数据被分配到各个分片上,分片可以是主分片(Primary Shard)或者是副本分片(Replica Shard),主分片和副本分片不会出现在同一个节点上(防止单点故障)。对集群中的索引定义其物理属性(如分片数、副本数等),需要在 Settings(设置) 中进行配置。
使用Kibana
我们推荐从官网下载与 ES 版本对应的 Kibana,如果 ES 都是默认配置,则 Kibana 不需要做额外配置,当然,如果为了支持在服务器以外的机器上访问,我们需要将 host 改成“0.0.0.0”。使用命令 nohup bin/kibana & 将其在后台启动起来。可以通过 “http://localhost:5601” 在浏览器中进行访问,我们后面的操作将在 Kibana 的 Dev Tools 中完成。
简单的REST API示例
ES 通过 REST API 显露出了很多功能,让用户可以构建 JSON 格式的创建、查询等各类操作,我们下面将在 Kibana 平台上,通过实际的数据,演示最简单的 REST API 操作,包括创建索引、查看索引、删除索引、创建文档等,以加深对 ES 的基本概念的认识:
创建索引
在 Kibana 中输入 PUT /shopping 点击执行按钮,就可以看到右侧 ES 返回的响应:1
2
3
4
5{
"acknowledged" : true, //响应结果
"shards_acknowledged" : true, //分片结果
"index" : "shopping" //索引名称
}
此时,如果再次执行 PUT /shopping 创建一个同名的索引,则会返回错误信息:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17{
"error" : {
"root_cause" : [
{
"type" : "resource_already_exists_exception",
"reason" : "index [shopping/bu5v-UQDQGChrcvunLV5iA] already exists",
"index_uuid" : "bu5v-UQDQGChrcvunLV5iA",
"index" : "shopping"
}
],
"type" : "resource_already_exists_exception",
"reason" : "index [shopping/bu5v-UQDQGChrcvunLV5iA] already exists",
"index_uuid" : "bu5v-UQDQGChrcvunLV5iA",
"index" : "shopping"
},
"status" : 400
}
查看索引
在 Kibana 中输入 GET /shopping 点击执行按钮,在右侧就会看到当前索引的相关信息:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25{
"shopping" : { //索引名
"aliases" : { }, //别名
"mappings" : { }, //映射
"settings" : { //设置
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"number_of_shards" : "1", //主分片数量
"provided_name" : "shopping",
"creation_date" : "1631953527202",
"number_of_replicas" : "1", //副本分片数量
"uuid" : "bu5v-UQDQGChrcvunLV5iA",
"version" : {
"created" : "7140199"
}
}
}
}
}
如果想要查看当前ES实例中都有哪些索引,则需要执行请求 GET /_cat/indices?v,请求路径中的
_cat 表示查看的意思:1
2health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open shopping bu5v-UQDQGChrcvunLV5iA 1 1 0 0 208b 208b
返回字段的含义是: health=当前服务器健康状态 green(集群完整)yellow(单点正常、集群不完整) red(单点不正常); status=索引打开、关闭状态; index=索引名;uuid=索引统一编号; pri=主分片数量; rep=副本数量; docs.count=可用文档数量; docs.deleted=文档删除状态(逻辑删除); store.size=主分片和副分片整体占空间大小; pri.store.size=主分片占空间大小。
删除索引
在 Kibana 中输入 DELETE /shopping 点击执行按钮,在右侧会返回:1
2
3{
"acknowledged" : true
}
此时,再用上面的查看命令查看就会出现报错,或在所有的索引列表中没有了该索引,删除索引会立即释放相应的磁盘空间。
创建文档
默认我们已经创建好了索引 shopping,在 Kibana 中输入 POST /shoppint/_doc 并附上文档的 JSON 内容:1
2
3
4
5
6{
"title": "小米手机",
"category": "小米",
"images": "http://www.pictures.com/xm.jpg",
"price": 3999.00
}
此时,右侧返回的响应结果为:1
2
3
4
5
6
7
8
9
10
11
12
13
14{
"_index" : "shopping", // 索引
"_type" : "_doc", // 默认唯一的“类型”
"_id" : "W7R-C3wBLUpZGbU12mrM", // 文档的唯一标识,未指定则随机生成
"_version" : 1, // 版本
"result" : "created", // 表示创建成功
"_shards" : {
"total" : 2, // 分片总数
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
自定义唯一性标识则需要在创建文档时指定:POST /shopping/_doc/1,这里的 1 就是指定的 _id。需要注意的是,第一条命令由于没有指定_id,所以只能用 POST 命令,第二条指定了数据主键,则 POST 和 PUT 都是可行的请求。
查看文档
查看文档时,需要指明文档的唯一性标识,在 Kibana 中输入 GET /shopping/_doc/1,执行后就能返回对应的文档内容。另一个常用的查看文档命令是查看索引下的所有数据,GET /shopping/_search,返回的结果如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31{
"took" : 7,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "shopping",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"title" : "小米手机",
"category" : "小米",
"images" : "http://www.pictures.com/xm.jpg",
"price" : 3999.0
}
}
]
}
}
删改文档
和新增文档一样,使用 POST 命令输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖;当然还可以只修改某一文档的局部字段,那么此时需要在 URL 中增加 _update 关键字,并指定文档 _id 使用 PSOT /shopping/_update/1 命令带上修改字段的 JSON 内容:1
2
3
4
5
6{
"doc": {
"title": "华为手机",
"category": "华为"
}
}
修改成功后会回复如下内容:1
2
3
4
5
6
7
8
9
10
11
12
13
14{
"_index" : "shopping",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"result" : "updated", // 表示数据已被更新
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
再次查看对应的文档,则发现相应的字段被修改了:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15{
"_index" : "shopping",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"_seq_no" : 1,
"_primary_term" : 1,
"found" : true,
"_source" : {
"title" : "华为手机",
"category" : "华为",
"images" : "http://www.pictures.com/xm.jpg",
"price" : 3999.0
}
}
最后,我们说说文档的删除机制,删除一个文档需要向 ES 发送 DELETE /shopping/_doc/1 命令,但 ES 不会立即从磁盘上移除该文档,而只是将其标记成已删除(逻辑删除),即仍然可以被检索到,但最终会被过滤而不返回。