Elasticsearch扫盲之六:ElasticSearch文档操作之单个文档、多个文档即_mget批量文档获取和_bulk批量文档操作

ElasticSearch中的文档表示一条记录,类似于MySQL中的一行记录

一、单个文档

1.创建文档
  • 请求类型:PUT
  • 请求地址:{{indexName}}/{{typeName}}/{{id}}
  • 参数:文档数据对象
  1. PUT user/_doc/5
  2. {
  3. "user_id":5,
  4. "account":"frank",
  5. "email":"frank@gmail.com",
  6. "status":1,
  7. "nickname":"Frank",
  8. "create_time":1554015482530
  9. }
2.更新文档
(1)通过主键ID来实现更新

和创建文档是相同的,但注意,通过主键ID更新前,最好先查询原文档数据,与新数据进行合并,不然,如果新文档的结构与原文档结构不一致,或者缺少部分数据,那么,就会完全覆盖原数据。

如:

  1. PUT user/_doc/5
  2. {
  3. "nickname":"福兰克"
  4. }

那么更新后的文档数据为:

  1. {
  2. "nickname":"福兰克"
  3. }

所以建议使用完整的数据,如下:

  1. PUT user/_doc/5
  2. {
  3. "user_id":5,
  4. "account":"frank",
  5. "email":"frank@gmail.com",
  6. "status":1,
  7. "nickname":"福兰克",
  8. "create_time":1554015482530
  9. }
(2)通过条件来实现更新

主要是通过指定文档内容或通过脚本来实现的

  • 请求方式:POST
  • 请求地址:/{{indexName}}/{{typeName}}/{{id}}/_update
  • 参数:
    • doc : 提交的数据对象
    • script:
      • source :脚本语句
      • lang : 指定脚本语言类型(一般为painless)
      • params : 传入脚本的参数对象

A.通过指定文档内容来实现更新

  1. POST /user/_doc/5/_update
  2. {
  3. "doc":{
  4. "nickname":"Frank"
  5. }
  6. }

B.通过脚本来实现更新

  1. POST /user/_doc/5/_update
  2. {
  3. "script":{
  4. "source":"ctx._source.nickname = params.nickname;ctx._source.email=params.email",
  5. "lang":"painless",
  6. "params":{
  7. "nickname":"福兰克斯",
  8. "email":"frank@live.com"
  9. }
  10. }
  11. }
3.删除文档
  • 请求方式:DELETE
  • 请求地址:/{{indexName}}/{{typeName}}/{{id}}
  1. DELETE /user/_doc/5
4.获取文档数据
  • 请求方式:GET
  • 请求地址:/{{indexName}}/{{typeName}}/{{id}}
  1. GET /user/_doc/5

获取的数据结构如下:

  1. {
  2. "_index" : "user",
  3. "_type" : "_doc",
  4. "_id" : "5",
  5. "_version" : 5,
  6. "_seq_no" : 8,
  7. "_primary_term" : 2,
  8. "found" : true,
  9. "_source" : {
  10. "user_id" : 5,
  11. "account" : "frank",
  12. "email" : "frank@live.com",
  13. "status" : 1,
  14. "nickname" : "福兰克斯",
  15. "create_time" : 1554015482530
  16. }
  17. }
  • _index : 当前文档所在的index的名称
  • _type : 当前文档所在的type的名称
  • _id : 当前文档的ID
  • _version : 当前文档的版本号,根据更新的次数来更新的
  • found:表示获取到文档的内容
  • _source : 获取的文档数据主体

二、多个文档

这里多个文档是指,批量操作多个文档,搜索查询文档将在之后的章节讲解

1.批量获取文档数据

批量获取文档数据是通过_mget的API来实现的

(1)在URL中不指定index和type
  • 请求方式:GET
  • 请求地址:_mget
  • 功能说明 : 可以通过ID批量获取不同index和type的数据
  • 请求参数:
    • docs : 文档数组参数
      • _index : 指定index
      • _type : 指定type
      • _id : 指定id
      • _source : 指定要查询的字段
  1. GET _mget
  2. {
  3. "docs": [
  4. {
  5. "_index": "user",
  6. "_type": "_doc",
  7. "_id": 1
  8. },
  9. {
  10. "_index": "user",
  11. "_type": "_doc",
  12. "_id": 2
  13. },
  14. {
  15. "_index": "article",
  16. "_type": "_doc",
  17. "_id": 1
  18. }
  19. ]
  20. }

响应结果如下:

  1. {
  2. "docs" : [
  3. {
  4. "_index" : "user",
  5. "_type" : "_doc",
  6. "_id" : "1",
  7. "_version" : 1,
  8. "_seq_no" : 0,
  9. "_primary_term" : 1,
  10. "found" : true,
  11. "_source" : {
  12. "user_id" : 1,
  13. "account" : "shixinke",
  14. "email" : "ishixinke@gmail.com",
  15. "status" : 1,
  16. "nickname" : "诗心客",
  17. "create_time" : 1553936640476
  18. }
  19. },
  20. {
  21. "_index" : "user",
  22. "_type" : "_doc",
  23. "_id" : "2",
  24. "_version" : 1,
  25. "_seq_no" : 1,
  26. "_primary_term" : 1,
  27. "found" : true,
  28. "_source" : {
  29. "user_id" : 2,
  30. "account" : "tom",
  31. "email" : "tom@foxmail.com",
  32. "status" : 1,
  33. "nickname" : "Tom",
  34. "create_time" : 1553936035676
  35. }
  36. },
  37. {
  38. "_index" : "article",
  39. "_type" : "_doc",
  40. "_id" : "1",
  41. "_version" : 1,
  42. "_seq_no" : 0,
  43. "_primary_term" : 1,
  44. "found" : true,
  45. "_source" : {
  46. "id" : 1,
  47. "title" : "ElasticSearch安装与部署",
  48. "content" : "ElasticSearch单机安装和集群部署",
  49. "tags" : [
  50. "ElasticSearch",
  51. "搜索引擎"
  52. ],
  53. "create_time" : 1554015482530
  54. }
  55. }
  56. ]
  57. }
(2)在URL中指定index
  • 请求方式:GET
  • 请求地址:/{{indexName}}/_mget
  • 功能说明 : 可以通过ID批量获取不同index和type的数据
  • 请求参数:
    • docs : 文档数组参数
      • _index : 指定index
      • _type : 指定type
      • _id : 指定id
      • _source : 指定要查询的字段
  1. GET /user/_mget
  2. {
  3. "docs": [
  4. {
  5. "_type":"_doc",
  6. "_id": 3
  7. },
  8. {
  9. "_type":"_doc",
  10. "_id": 4
  11. }
  12. ]
  13. }
(3)在URL中指定index和type
  • 请求方式:GET
  • 请求地址:/{{indexName}}/{{typeName}}/_mget
  • 功能说明 : 可以通过ID批量获取不同index和type的数据
  • 请求参数:
    • docs : 文档数组参数
      • _index : 指定index
      • _type : 指定type
      • _id : 指定id
      • _source : 指定要查询的字段
  1. GET /user/_doc/_mget
  2. {
  3. "docs": [
  4. {
  5. "_id": 3
  6. },
  7. {
  8. "_id": 4
  9. }
  10. ]
  11. }
2.批量操作文档数据

批量对文档进行写操作是通过_bulk的API来实现的

  • 请求方式:POST
  • 请求地址:_bulk
  • 请求参数:通过_bulk操作文档,一般至少有两行参数(或偶数行参数)
    • 第一行参数为指定操作的类型及操作的对象(index,type和id)
    • 第二行参数才是操作的数据

参数类似于:

  1. {"actionName":{"_index":"indexName", "_type":"typeName","_id":"id"}}
  2. {"field1":"value1", "field2":"value2"}
  • actionName:表示操作类型,主要有create,index,delete和update
(1)批量创建文档create
  1. POST _bulk
  2. {"create":{"_index":"article", "_type":"_doc", "_id":3}}
  3. {"id":3,"title":"java面向对象1","content":"java面向对象1","tags":["java", "面向对象"],"create_time":1554015482530}
  4. {"create":{"_index":"article", "_type":"_doc", "_id":4}}
  5. {"id":4,"title":"java面向对象2","content":"java面向对象2","tags":["java", "面向对象"],"create_time":1554015482530}
(2)普通创建或全量替换index
  1. POST _bulk
  2. {"index":{"_index":"article", "_type":"_doc", "_id":3}}
  3. {"id":3,"title":"java面向对象(一)","content":"java面向对象一","tags":["java", "面向对象"],"create_time":1554015482530}
  4. {"index":{"_index":"article", "_type":"_doc", "_id":4}}
  5. {"id":4,"title":"java面向对象(一)","content":"java面向对象二","tags":["java", "面向对象"],"create_time":1554015482530}
  • 如果原文档不存在,则是创建
  • 如果原文档存在,则是替换(全量修改原文档)
(3)批量删除delete
  1. POST _bulk
  2. {"delete":{"_index":"article", "_type":"_doc", "_id":3}}
  3. {"delete":{"_index":"article", "_type":"_doc", "_id":4}}
(4)批量修改update
  1. POST _bulk
  2. {"update":{"_index":"article", "_type":"_doc", "_id":1}}
  3. {"doc":{"title":"分布式监控工具CAT极速入门"}}
  4. {"update":{"_index":"article", "_type":"_doc", "_id":2}}
  5. {"doc":{"create_time":1554018421008}}