当前位置: 首页>数据库>正文

es文档实体类设计 es创建文档

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请求添加文档"
}

两种方式添加文档后的结果:

es文档实体类设计 es创建文档,es文档实体类设计 es创建文档_json,第1张

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数据:

es文档实体类设计 es创建文档,es文档实体类设计 es创建文档_json_02,第2张

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":"最初的内容..."
}

es文档实体类设计 es创建文档,es文档实体类设计 es创建文档_es文档实体类设计_03,第3张

根据条件更新:

如下,就是将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文件

es文档实体类设计 es创建文档,es文档实体类设计 es创建文档_es_04,第4张

  • 第一行:表示进行索引操作,新建一个名为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后的内容:

es文档实体类设计 es创建文档,es文档实体类设计 es创建文档_新建文档_05,第5张



https://www.xamrdz.com/database/68w1932732.html

相关文章: