文章目录
简介
https://www.elastic.co/cn/what-is/elasticsearch
全文搜索属于最常见的需求,开源的Elasticsearch 是目前全文搜索引擎的首选。
它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github都采用它 Elastic的底层是开源库Lucene。 但是,你没法直接用Lucene,必须自己写代码去调用它的接口。Elastic 是Lucene 的封装,提供了RESTAPI 的操作接口,开箱即用。
REST API:天然的跨平台。
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
官方中文:https://www.elastic.co/guide/cn/elasticsearch/guide/current/foreword_id.html
社区中文:
https://es.xiaoleilu.com/index.html
http://doc.codingdict.com/elasticsearch/0/
一、基本概念
1、Index (索引)
动词,相当于MySQL中的insert;
名词,相当于MySQL中的Database
2、Type (类型)
在Index (索引)中,可以定义一个或多个类型。
类似于MySQL中的Table;每一种类型的数据放在一起;
3、Document (文档)
保存在某个索引(Index) 下,某种类型(Type)的一个数据(Document),文档是JSON格式的,Document就像是MySQL中的某个Table里面的内容;

4、倒排索引
二、Docker安装 Es
1、下载镜像文件
# 存储和检索
docker pull elasticsearch:7.6.2
# 可视化检索数据
docker pull kibana:7.6.2
查看虚拟机可用内存free -m
2、创建实例
1、ElasticSearch
(1)配置
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml
chmod -R 777 /mydata/elasticsearch/
(2)启动Elasticsearch
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/elasticsearch/plugins \
-d elasticsearch:7.6.2
以后再外面装好插件重启即可;
特别注意:
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
测试环境下,设置ES的初始内存和最大内存,否则导致过大启动不了ES
设置开机启动elasticsearch
docker update elasticsearch --restart=always
2、Kibana
(1)配置
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 -p 5601:5601 -d kibana:7.6.2
http://192.168.56.10:9200
:一定要改为自己虚拟机
设置开机启动kibana
docker update kibana --restart=always
(2)测试
查看elasticsearch版本信息: http://192.168.56.10:9200/
{
"name": "0adeb7852e00",
"cluster_name": "elasticsearch",
"cluster_uuid": "9gglpP0HTfyOTRAaSe2rIg",
"version": {
"number": "7.6.2",
"build_flavor": "default",
"build_type": "docker",
"build_hash": "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date": "2020-03-26T06:34:37.794943Z",
"build_snapshot": false,
"lucene_version": "8.4.0",
"minimum_wire_compatibility_version": "6.8.0",
"minimum_index_compatibility_version": "6.0.0-beta1"
},
"tagline": "You Know, for Search"
}
显示elasticsearch 节点信息 http://192.168.56.10:9200/_cat/nodes
127.0.0.1 76 95 1 0.26 1.40 1.22 dilm * 0adeb7852e00
也可以在docker官网查看到kibana:https://hub.docker.com/_/kibana
访问Kibana:http://192.168.56.10:5601/app/kibana
三、初步检索
1、_CAT
(1)GET/cat/nodes:查看所有节点
如:http://192.168.137.14:9200/_cat/nodes
127.0.0.1 61 91 11 0.08 0.49 0.87 dilm * 0adeb7852e00
注: *表示集群中的主节点
(2)GET/cat/health:查看es健康状况
如: http://192.168.137.14:9200/_cat/health
1588332616 11:30:16 elasticsearch green 1 1 3 3 0 0 0 0 - 100.0%
注:green表示健康值正常
(3)GET/cat/master:查看主节点
如: http://192.168.137.14:9200/_cat/master
vfpgxbusTC6-W3C2Np31EQ 127.0.0.1 127.0.0.1 0adeb7852e00
(4)GET/_cat/indicies:查看所有索引 ,等价于mysql数据库的show databases;
如: http://192.168.137.14:9200/_cat/indices
green open .kibana_task_manager_1 KWLtjcKRRuaV9so_v15WYg 1 0 2 0 39.8kb 39.8kb
green open .apm-agent-configuration cuwCpJ5ER0OYsSgAJ7bVYA 1 0 0 0 283b 283b
green open .kibana_1 PqK_LdUYRpWMy4fK0tMSPw 1 0 7 0 31.2kb 31.2kb
2、索引一个文档(保存)
保存一个数据,保存在哪个索引的哪个类型下,指定用那个唯一标识
PUT customer/external/1;在customer索引下的external类型下保存1号数据为
PUT customer/external/1
{
"name":"John Doe"
}
PUT和POST都可以
POST新增。如果不指定id,会自动生成id。指定id就会修改这个数据,并新增版本号;
PUT可以新增也可以修改。PUT必须指定id;由于PUT需要指定id,我们一般用来做修改操作,不指定id会报错。
下面是在postman中的测试数据:
创建数据成功后,显示201 created表示插入记录成功。
{
"_index": "customer",
"_type": "external",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
这些返回的JSON串的含义;这些带有下划线开头的,称为元数据,反映了当前的基本信息。
“_index”: “customer” 表明该数据在哪个数据库下;
“_type”: “external” 表明该数据在哪个类型下;
“_id”: “1” 表明被保存数据的id;
“_version”: 1, 被保存数据的版本
“result”: “created” 这里是创建了一条数据,状态为create,如果重新put一条数据,则该状态会变为updated,并且版本号也会发生变化。
下面选用POST方式:
- 添加数据的时候,不指定ID,会自动的生成id,并且类型是新增:
- 再次使用POST插入数据,仍然是新增的:
- 添加数据的时候,指定ID,会使用该id,并且类型是新增:
- 再次使用POST插入数据,类型为updated
3、查询文档
GET /customer/external/1
http://192.168.56.10:9200/customer/external/1
{
"_index": "customer",//在哪个索引
"_type": "external",//在哪个类型
"_id": "1",//记录id
"_version": 3,//版本号
"_seq_no": 6,//并发控制字段,每次更新都会+1,用来做乐观锁
"_primary_term": 1,//同上,主分片重新分配,如重启,就会变化
"found": true,
"_source": {
"name": "John Doe"
}
}
通过 “if_seq_no=1&if_primary_term=1
”,当序列号匹配的时候,才进行修改,否则不修改。
实例:将id=1的数据更新为name=1,然后再次更新为name=2,起始_seq_no=6,_primary_term=1
(1)将name更新为1
http://192.168.137.14:9200/customer/external/1?if_seq_no=6&if_primary_term=1
(2)将name更新为2,更新过程中使用seq_no=6
http://192.168.137.14:9200/customer/external/1?if_seq_no=6&if_primary_term=1
出现更新错误。
(3)查询新的数据
http://192.168.137.14:9200/customer/external/1
能够看到_seq_no变为7。
(4)再次更新,更新成功
http://192.168.137.14:9200/customer/external/1?if_seq_no=7&if_primary_term=1
4、更新文档
补充:POST和PUT不带_update 也是可以。
(1)POST更新文档,带有_update
http://192.168.137.14:9200/customer/external/1/_update
如果再次执行更新,则不执行任何操作,序列号也不发生变化
POST更新方式,会对比原来的数据,和原来的相同,则不执行任何操作(version和_seq_no)都不变。
(2)POST更新文档,不带_update
在更新过程中,重复执行更新操作,数据也能够更新成功,不会和原来的数据进行对比。
5、删除文档&索引
DELETE customer/external/1
DELETE customer
注:elasticsearch并没有提供删除类型的操作,只提供了删除索引和文档的操作。
- 实例:删除id=1的数据,删除后继续查询
- 实例:删除整个costomer索引数据
删除前,所有的索引
green open .kibana_task_manager_1 KWLtjcKRRuaV9so_v15WYg 1 0 2 0 39.8kb 39.8kb
green open .apm-agent-configuration cuwCpJ5ER0OYsSgAJ7bVYA 1 0 0 0 283b 283b
green open .kibana_1 PqK_LdUYRpWMy4fK0tMSPw 1 0 7 0 31.2kb 31.2kb
yellow open customer nzDYCdnvQjSsapJrAIT8Zw 1 1 4 0 4.4kb 4.4kb
删除“ customer ”索引
删除后,所有的索引
green open .kibana_task_manager_1 KWLtjcKRRuaV9so_v15WYg 1 0 2 0 39.8kb 39.8kb
green open .apm-agent-configuration cuwCpJ5ER0OYsSgAJ7bVYA 1 0 0 0 283b 283b
green open .kibana_1 PqK_LdUYRpWMy4fK0tMSPw 1 0 7 0 31.2kb 31.2kb
6、bulk批量API
语法:
{
action:{
metadata}}\n
{
request body }\n
{
action:{
metadata}}\n
{
request body }\n
这里的批量操作,当发生某一条执行发生失败时,其他的数据仍然能够接着执行,也就是说彼此之间是独立的。
这里使用postman不好使,我们使用安装的kibana插件。
- 实例1: 执行多条数据
POST customer/external/_bulk
{
"index":{
"_id":"1"}}
{
"name":"John Doe"}
{
"index":{
"_id":"2"}}
{
"name":"John Doe"}
执行结果:
#! Deprecation: [types removal] Specifying types in bulk requests is deprecated.
{
"took" : 491,
"errors" : false,
"items" : [
{
"index" : {
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1,
"status" : 201
}
},
{
"index" : {
"_index" : "customer",
"_type" : "external",
"_id" : "2",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1,
"status" : 201
}
}
]
}
- 实例2:对于整个索引执行批量操作
POST /_bulk
{
"delete":{
"_index":"website","_type":"blog","_id":"123"}}
{
"create":{
"_index":"website","_type":"blog","_id":"123"}}
{
"title":"my first blog post"}
{
"index":{
"_index":"website","_type":"blog"}}
{
"title":"my second blog post"}
{
"update":{
"_index":"website","_type":"blog","_id":"123"}}
{
"doc":{
"title":"my updated blog post"}}
执行结果:
#! Deprecation: [types removal] Specifying types in bulk requests is deprecated.
{
"took" : 608,
"errors" : false,
"items" : [
{
"delete" : {
"_index" : "website",
"_type" : "blog",
"_id" : "123",
"_version" : 1,
"result" : "not_found",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1,
"status" : 404
}
},
{
"create" : {
"_index" : "website",
"_type" : "blog",
"_id" : "123",
"_version" : 2,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1,
"status" : 201
}
},
{
"index" : {
"_index" : "website",
"_type" : "blog",
"_id" : "MCOs0HEBHYK_MJXUyYIz",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 2,
"_primary_term" : 1,
"status" : 201
}
},
{
"update" : {
"_index" : "website",
"_type" : "blog",
"_id" : "123",
"_version" : 3,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 1,
"status" : 200
}
}
]
}
bulk api以此按顺序执行所有的action(动作)。如果一个单个的动作因任何原因失败,它将继续处理它后面剩余的动作。当bulk api返回时,它将提供每个动作的状态(与发送的顺序相同),所以您可以检查是否一个指定的动作是否失败了。
7、样本测试数据
准备了一份顾客银行账户信息的虚构的JSON文档样本。每个文档都有下列的schema(模式)。
{
"account_number": 1,
"balance": 39225,
"firstname": "Amber",
"lastname": "Duke",
"age": 32,
"gender": "M",
"address": "880 Holmes Lane",
"employer": "Pyrami",
"email": "[email protected]",
"city": "Brogan",
"state": "IL"
}
https://github.com/elastic/elasticsearch/blob/master/docs/src/test/resources/accounts.json ,导入测试数据,
POST bank/account/_bulk
如果有收获!!! 希望老铁们来个三连,点赞、收藏、转发。
创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客