ElasticSearch的文档操作
1、新建文档
新建文档首先要新建一个索引
# 创建索引
PUT blog
新建文档:
# 新建文档(PUT中的“1”是添加的文档的id)
PUT blog/_doc/1
{
"title":"添加文档",
"date":"2020/12/13",
"content":"文档的内容哒哒哒"
}
# 不指定id添加文档的方法(会自动生成id)
POST blog/_doc
{
"title":"不指定id",
"date":"2020/12/13",
"content":"使用POST请求添加文档"
}
两种方式添加文档后的结果:
2、获取文档
# 获取文档
GET blog/_doc/1
# 获取不存在的文档(返回的json数据中会显示"found" : false)
GET blog/_doc/2
# 探测某个文档是否存在
HEAD blog/_doc/1 # 存在返回200
HEAD blog/_doc/2 # 不存在返回404
# 批量获取文档是否存在
GET blog/_mget
{
"ids":["1","xxx"]
}
GET blog/_doc/1
执行时(查询成功)返回的JSON数据:
3、更新文档
对文档进行更新操作时,文档每更新一次,_version的值就会+1
1、直接put会替换整个文档的内容
# 1 更新整个文档(原先的数据全部抹去)
PUT blog/_doc/TMCtW3YB6Yv6dK2N-lA4
{
"title":"更新了整个文档"
}
2、借助脚本实现指定字段的更新
- lang:指定了使用的脚本语言,painless是ES内置的一个脚本语言
- source:表示具体执行的内容
- ctx:代表上下文对象,可以借助ctx访问_source等内容
- ctx.op="xxx"表示进行的操作(下面的delete表示删除整个文档,none表示不进行任何操作)
- add、if/else等都是脚本语言的一些基础功能
# 2 更新某个字段 借助脚本来实现
POST blog/_update/1
{
"script": {
"lang": "painless",
"source": "ctx._source.title=params.title",
"params": {
"title":"更新了指定的字段"
}
}
}
# 直接向原先的文档中添加字段
# (不借助外部的变量,直接在source中赋值时要对引号进行转译)
POST blog/_update/1
{
"script": {
"lang": "painless",
"source": "ctx._source.tags=[\"Java\",\"Python\"]"
}
}
# 修改数组,比如进行增加操作(add方法)
POST blog/_update/1
{
"script": {
"lang": "painless",
"source": "ctx._source.tags.add(\"JavaScript\")"
}
}
# if else条件判断
POST blog/_update/1
{
"script": {
"lang": "painless",
"source":
"if(ctx._source.tags.contains(\"Java\")){ctx.op=\"delete\"}else{ctx.op=\"none\"}"
}
}
3、查询更新
根据条件查询文档,然后更新该文档
模拟更新,先新建一个文档:
PUT blog/_doc/2
{
"title":"doc01",
"content":"最初的内容..."
}
根据条件更新:
如下,就是将title为"doc01"的文档的content修改为"修改后的数据"
POST blog/_update_by_query
{
"script": {
"source": "ctx._source.content=\"修改后数据\"",
"lang": "painless"
},
"query": {
"term": {
"title":"doc01"
}
}
}
4、删除文档
根据id删除
如果在添加文档时指定了路由,那么删除文档时也要指定路由,否则删除会失败
DELETE blog/_doc/1
查询删除
# 根据条件删除
POST blog/_delete_by_query
{
"query":{
"term":{
"title":"doc01"
}
}
}
删除索引下的所有文档
# 删除索引下的所有文档
POST blog/_delete_by_query
{
"query":{
"match_all":{}
}
}
5、批量操作
ElasticSearch中可以通过Bulk API进行批量索引、删除、更新等操作。
做法是将所有操作写入一个json文件中,通过post请求上传该json文件并执行。
如创建一个JSON文件
- 第一行:表示进行索引操作,新建一个名为person的索引,_id表示新建文档的id为1;
- 第二行:代表第一行操作的参数,创建的id为1的文档的name值为"Fall"
- 第三行:进行更新操作,对索引为person中id为1的文档进行更新
- 第四行:表示更新文档的name为"sprogFall"
注意文件的最后一行要空出一行,否则会出现错误:
{“error”:{“root_cause”:[{“type”:“illegal_argument_exception”,“reason”:“The bulk request must be terminated by a newline [\n]”}],“type”:“illegal_argument_exception”,“reason”:“The bulk request must be terminated by a newline [\n]”},“status”:400}
最后通过CMD命令发送给ES服务器并执行:
@后面加文件名(如果命令行不在当前文件的目录下,则必须指定文件的路径)
curl -XPOST "http://localhost:9200/person/_bulk" -H "content-type:application/json" --data-binary @script.json
最后的效果,name已经是update后的内容: