1. 文档CRDU规则
- 规则:
PUT/POST/GET/DELETE 索引名称/_doc
- 文档相关的操作Type都用_doc
操作 | 举个栗子 | 说明 |
---|---|---|
index | PUT my_index/_doc/1 {“user”:“Mike”, “comment”:“You know, for search”} | 如果ID不存在,创建新的文档,否则,先删除现有的文档,再创建新的文档,版本会增加 |
create | PUT my_index/_create/1 {“user”:“Mike”, “comment”:“You know, for search”} POST my_index/_doc (不指定ID, 自动生成) {“user”:“Mike”, “comment”:“You know, for search”} | - 有两种方式, - 1. 指定ID - 2. 不指定ID,系统自动生成一串随机字符串 - 如果ID已经存在,会失败 |
read | GET my_index/_update/1 | 无 |
update | POST my_index/_update {“doc”: {“user”:“Mike”, “comment”:“You know, for search”}} | 文档必须已经存在,更新只会对相应字段做增量修改 |
delete | DELETE my_index/_doc/1 | 无 |
Kibana 实际操作
- 打开Dev Tool,先创建一个索引
Create 一个文档
- 支持自动生成文档ID和指定文档ID两种方式:
-
- 指定文档ID创建:
-
PUT users/_create/1
{
"firstName":"Jinjuan",
"lastName": "Wu",
"tags":["Java", "ElasticSearch"]
}
-
1.1 操作成功
-
- 不指定文档ID创建
POST /users/_doc
{
"firstName":"Jinjuan1",
"lastName": "Wu",
"tags":["Java", "ElasticSearch"]
}
-
2.1 创建成功
-
使用HTTP PUT users/_create/1创建时,URI中显示指定_create,此时如果该ID的文档已经存在,显示操作失败
Get一个文档
- 文档源信息:
字段 | 说明 |
---|---|
_index | 索引名称 |
_type | 版本信息,同一个Id的文档,即使被删除,Version号也会不断增加 |
version | 版本信息,同一个Id的文档,即使被删除,Version号也会不断增加 |
_source | 默认包含了文档的所有原始信息 |
Index文档
- Index和Update还有Create不一样的地方:如果文档不存在,就索引新的文档,否则现有文档会被删除,新的文档会被索引,版本信息 + 1
PUT users/_doc/1
{
"tags":["少女", "女汉子"]
}
- GET users/_doc/1 查看一下,firstName和lastName都没了
Update文档
- Update方法不会删除原来的文档,而是实现真正的数据更新
- Post方法 / Payload,注意:需要包含在**“doc”**中
更新没有的字段
Get一下
更新已存在的字段
POST users/_update/1
{
"doc":{
"tags" : [
"是少女啊",
"女汉子"
],
"emails":["532791689@qq.com","wujinjuan5@163.com"]
}
}
Bulk API
背景:频繁地调用API查询会增加时间成本,就像多次连接数据库带来的成本一样,Bulk API能做到:
- 在一次API调用中,对不同的索引进行操作
- 支持四种类型操作
- index
- create
- update
- delete
- 可以在URI中指定index,也可以在请求的Payload中进行
- 操作中单条操作失败,并不会影响其他操作
- 返回结果包罗了每一条操作执行的结果
Bulk的格式
{action:{metadata}}\n
{requestbody}
action(行为) | 说明 |
---|---|
create | 文档不存在时创建 |
create | 更新文档 |
index | 创建新文档或替换已有文档 |
delete | 删除一个文档 |
- metadata:_index, _type, _id
- requestbody: 请求体参数们
示例
POST _bulk
{"index":{"_index":"users", "_id":"1"}}
{"tags":"532791689@qq.com"}
- 如果你不想每个操作都写_index的话,你可以在POST后面指定索引名,比如这样:(前提是操作同一个索引)
POST /users/_bulk
{"index":{"_id":"1"}}
{"tags":"532791689@qq.com"}
批量添加
POST /users/_bulk
{"create":{"_id":5}}
{"firstName" : "San", "lastName" : "Zhang"}
{"create":{"_id":6}}
{"firstName" : "Wu", "lastName" : "Zhao"}
批量删除
POST /users/_bulk
{"delete":{"_id":5}}
{"index":{"_id":8}}
{"name":"zhangsan"}
{"delete":{"_id":6}}
bulk一次最大处理多少数据量
- bulk会把将要处理的数据载入内存中,所以数据量是有限制的,最佳的数据量不是一个确定的数值,它取决于你的硬件,你的文档大小以及复杂性,你的索引以及搜索的负载。
- 一般建议是1000-5000个文档,大小建议是5-15MB,默认不能超过100M,可以在es的配置文件(即$ES_HOME下的config下的elasticsearch.yml)中。
批量获取 - mget
- 批量操作,可以减少网络连接所产生的开销,提高性能
GET /users/_mget
{
"ids":["1","2","3","4","5","6"]
}
- 查询结果太长,截图不全就放到代码块了。可见,查不到的数据会显示found:false
{
"docs" : [
{
"_index" : "users",
"_type" : "_doc",
"_id" : "1",
"_version" : 16,
"_seq_no" : 19,
"_primary_term" : 1,
"found" : true,
"_source" : {
"tags" : [
"是少女啊",
"女汉子"
],
"emails" : [
"532791689@qq.com",
"wujinjuan5@163.com"
],
"firstName" : "Jinjuan",
"lastName" : "Wu"
}
},
{
"_index" : "users",
"_type" : "_doc",
"_id" : "2",
"_version" : 2,
"_seq_no" : 16,
"_primary_term" : 1,
"found" : true,
"_source" : {
"title" : "Html5",
"price" : 45
}
},
{
"_index" : "users",
"_type" : "_doc",
"_id" : "3",
"_version" : 1,
"_seq_no" : 3,
"_primary_term" : 1,
"found" : true,
"_source" : {
"firstName" : "Da",
"lastName" : "Wu",
"tags" : [
"Java",
"ElasticSearch"
]
}
},
{
"_index" : "users",
"_type" : "_doc",
"_id" : "4",
"found" : false
},
{
"_index" : "users",
"_type" : "_doc",
"_id" : "5",
"_version" : 1,
"_seq_no" : 20,
"_primary_term" : 1,
"found" : true,
"_source" : {
"firstName" : "San",
"lastName" : "Zhang"
}
},
{
"_index" : "users",
"_type" : "_doc",
"_id" : "6",
"_version" : 1,
"_seq_no" : 21,
"_primary_term" : 1,
"found" : true,
"_source" : {
"firstName" : "Wu",
"lastName" : "Zhao"
}
}
]
}
常见错误返回
问题 | 原因 |
---|---|
无法连接 | 网络故障或集群挂了 |
连接无法关闭 | 网络故障或节点出错 |
429 | 集群过于繁忙 |
4xx | 请求体格式有错 |
500 | 集群内部错误 |