Elasticsearch 简介

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。

Docker安装ES

下载镜像文件

1
2
docker pull elasticsearch:7.4.2 # 存储和检索数据
docker pull kibana:7.4.2 # 可视化检索数据

创建ES实例

1
2
3
mkdir -p /mydata/elasticsearch/config	# 创建es的配置目录
mkdir -p /mydata/elasticsearch/data # 创建es的配置目录
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml # 把远程配置写入到es的配置文件中

启动docker镜像

1
2
3
4
5
6
7
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/plugins \
-d elasticsearch:7.4.2

访问 ip:9200端口,查看是否安装成功

创建kibana实例

1
2
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.111.100:9200 -p 5601:5601 \
-d kibana:7.4.2

访问5601端口

ES入门

初步检索

_cat

192.168.111.100:9200/_cat/health # 查看健康状况

192.168.111.100:9200/_cat/master # 查看主节点信息

192.168.111.100:9200/_cat/indices # 查看所有索引 相当于mysql的show databases;

索引一个文档(保存)

保存一个数据,保存在哪个索引的哪个类型下,指定哪个唯一标识

PUT customer/external/1 在customer索引下的external类型下保存1号数据为

1
2
3
{
"name":"hello"
}

保存数据用PUT请求和POST请求都可以。

  • POST新增,如果不指定id,会自动生成id。指定id就会修改这个数据,并且新增版本号。

  • PUT可以新增也可以修改。PUT必须指定id,由于PUT需要指定id,我们一般都用来做修改操作,不指定id会报错。

查询文档

GET customer/external/1

结果

1
2
3
4
5
6
7
8
9
10
11
12
{
"_index": "customer", // 在哪个索引
"_type": "external", // 在哪个类型
"_id": "1", // 记录id
"_version": 2, // 版本号
"_seq_no": 1, // 并发控制字段,每次更新就会+1,用来做乐观锁
"_primary_term": 1, // 同上,主分片重新分配,如果重启,就会变化
"found": true,
"_source": { // 真正的内容
"name": "hello"
}
}

更新文档

POST更新带 _update

1
2
3
4
5
6
POST 192.168.111.100:9200/customer/external/1/_update
{
"doc":{
"name":"John"
}
}

结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"_index": "customer",
"_type": "external",
"_id": "1",
"_version": 5,
"result": "noop",
"_shards": {
"total": 0,
"successful": 0,
"failed": 0
},
"_seq_no": 5,
"_primary_term": 1
}

POST更新,不带_update

1
2
3
4
5
6
POST 192.168.111.100:9200/customer/external/1
{

"name":"John"

}

结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"_index": "customer",
"_type": "external",
"_id": "1",
"_version": 8,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 8,
"_primary_term": 1
}
  • 不同:POST操作会对比源文档数据,如果相同不会操作数据,文档version不增加
  • PUT操作总会将数据重新保存并增加version版本
  • 带_update对比元数据如果一样就不进行任何操作

删除文档

DELETE customer/external/1

1589899309878

bulk批量API

1
2
3
4
5
POST customer/external/_bulk
{"index":{"_id":"1"}}
{"name":"John"}
{"index":{"_id":"2"}}
{"name":"walk"}