1、es基本概念
es(elasticsearch):主用于检索,但也有存储,检索(Query DSL),分析(Aggregation(聚合))三个能力,与用于持久化的mysql相比,有三个概念需要理解。
mysql中,一个数据库,有多张表,表中有多个字段。
为简便理解,es中的三个概念可以与之相对应
index索引
类比mysql的数据库概念
Type类型(8.0版本之后没有类型的概念了)
类比mysql的表概念
Document文档
类比mysql的记录概念
保存一个数据,要指定保存在哪个索引的哪个类型下(哪张数据库哪张表下),
保存时用唯一标识指定对应的文档
2、es原理简述
对记录的数据进行拆分,维护生成一份倒排索引,搜索时分词查找,即将要查询的数据拆分后,查询
倒排索引表,便能知道哪些记录中有对应的数据,将所有有的记录进行相关性得分比较后,得到相应的数据
3、es安装
相应文档,其中的ip要改为自己的。
4、检索
_CAT
GET /_cat/nodes:查看所有节点_
eg:http://192.168.137.14:9200/_cat/nodes :
GET /_cat/health:查看es健康状况_
GET /_cat/master:查看主节点_
GET /_cat/indicies:查看所有索引 ,等价于mysql数据库的show databases;
PUT/ POST
保存一个数据,保存在哪个索引的哪个类型下,指定用那个唯一标识
PUT customer/external/1;在customer索引下的external类型下保存1号数据,
要带上要保存的json数据
POST新增。如果不指定id,会自动生成id。指定id就会修改这个数据,并新增版本号;相同的数据
不指定id,则会一直新增。
PUT可以新增也可以修改。PUT必须指定id;由于PUT需要指定id,我们一般用来做修改操作,
不指定id会报错。
返回结果解析
带有下划线开头的,称为元数据,反映了当前的基本信息。
"_index": 表明该数据在哪个数据库下;
"_type": 表明该数据在哪个类型下;
"_id": 表明被保存数据的id;
"_version": 被保存数据的版本
"result": "created" 这里是创建了一条数据,如果重新put一条数据,则该状态会变为updated,并且版本号也会发生变化。
GET
和put,post一样的,只是标注请求方式不同,用于查看文档。
返回json解析
{
"_index": ,//在哪个索引
"_type": ,//在哪个类型
"_id": ,//记录id
"_version": //版本号
"_seq_no": 6,//并发控制字段,每次更新都会+1,用来做乐观锁
"_primary_term": 1,//同上,主分片重新分配,如重启,就会变化
"found": true,
"_source": {
"name": "John Doe"
}
}
可以在请求后加入“?if_seq_no=&if_primary_term= ”,当序列号匹配的时候,才进行修改,否则不修改。
POST更新文档
eg:
http://192.168.56.10:9200/customer/external/1
会对比原来的数据,和原来的相同,则不执行任何操作(version和_seq_no)都不变。
不执行任何操作,序列号也不发生变化
http://192.168.56.10:9200/customer/external/1/_update
重复执行更新操作,数据也能够更新成功,不会和原来的数据进行对比
删除文档或索引
注:elasticsearch并没有提供删除类型的操作,只提供了删除索引和文档的操作。
DELETE 索引/类型/文档
DELETE 索引
eleasticsearch的批量操作——bulk
语法格式:
post /索引/类型/_bulk
json
{action:{metadata}}\n
{request body }\n
{action:{metadata}}\n
{request body }\n
为整个索引批量操作
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"}}
#指定操作,索引,类型,id
这里的批量操作,当发生某一条执行发生失败时,其他的数据仍然能够接着执行,也就是说彼此之间是独立的。
bulk api以此按顺序执行所有的action(动作)。如果一个单个的动作因任何原因失败,它将继续处理它后面剩余的动作。当bulk api返回时,它将提供每个动作的状态(与发送的顺序相同),所以您可以检查是否一个指定的动作是否失败了。
之前的都可以用postman测,但这个不行,那就用kibana测试
返回结果
#! Deprecation: [types removal] Specifying types in bulk requests is deprecated.
{
"took" : 6, --花费的时间
"errors" : false, --有无错误
"items" : [ --每个数据的结果
{
"index" : { --保存
"_index" : "customer", --索引
"_type" : "external", --类型
"_id" : "1", --文档
"_version" : 2, --版本
"result" : "updated", --更新
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 1,
"status" : 200
}
},
{
"index" : {
"_index" : "customer",
"_type" : "external",
"_id" : "2",
"_version" : 3,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 4,
"_primary_term" : 1,
"status" : 200
}
}
]
}
进阶检索
官方api:https://www.elastic.co/guide/en/elasticsearch/reference/7.x/search-your-data.html