Elasticsearch-核心篇(5)-文档操作

你的名字 2022-09-06 13:28 511阅读 0赞

文章目录

  • 一、添加文档
  • 二、更新文档
    • 2.1 全量更新
    • 2.2 增量更新
  • 三、查询文档
    • 3.1 单个查询
    • 3.2 查询所有
  • 四、删除文档
    • 4.1 删除单个文档
    • 4.2 条件删除文档

一、添加文档

操作说明

  • 文档可以类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式
  • 注意需要在索引后面添加_doc,表示操作文档
  • 在未指定id生成情况,每执行一次post将生成一个新文档
  • 如果index不存在,将会默认创建

命令示例

  1. POST es/_doc
  2. {
  3. "title": "小米手机",
  4. "category": "小米",
  5. "images": "http://www.gulixueyuan.com/xm.jpg",
  6. "price": 3999
  7. }

返回示例

  1. {
  2. "_index"【索引】: "es",
  3. "_type"【类型-文档】: "_doc",
  4. "_id"【唯一标识】: "DBeE23kBo6bwxxzx9qzl", #可以类比为MySQL中的主键,随机生成
  5. "_version"【版本】: 1,
  6. "result"【结果】: "created", #这里的create表示创建成功
  7. "_shards"【分片】: {
  8. "total"【分片 - 总数】: 2,
  9. "successful"【分片 - 成功】: 1,
  10. "failed"【分片 - 失败】: 0
  11. },
  12. "_seq_no": 0,
  13. "_primary_term": 1
  14. }

错误说明

  1. 不允许使用PUT提交,将会报错

    {

    1. "error": "Incorrect HTTP method for uri [/es/_doc] and method [GET], allowed: [POST]",
    2. "status": 405

    }

  2. 不能遗忘_doc,将会报错

    {

    1. "error": "Incorrect HTTP method for uri [/es] and method [POST], allowed: [GET, DELETE, PUT, HEAD]",
    2. "status": 405

    }

高级操作

  1. 指定生成id

    • 上面的数据创建后,由于没有指定数据唯一性标识(ID),默认情况下,ES服务器会随机生成一个
    • 如果想要自定义唯一性标识,需要在创建时指定:http://{ {ip:port}}/es/_doc/1

      • http://\{ {ip:port}}//_doc/
    • 指定后将会创建成功,重复执行请求时将更新文档,而不是创建新文档,此时version字段将更新

    {

    1. "_index": "es",
    2. "_type": "_doc",
    3. "_id"【此处id变成指定的id】: "1",
    4. "_version"【版本每次都会更新】: 4,
    5. "result": "updated",
    6. "_shards": {
    7. "total": 2,
    8. "successful": 1,
    9. "failed": 0
    10. },
    11. "_seq_no": 7,
    12. "_primary_term": 1

    }

  2. PUT创建文档,在未指定id时put创建文档将会报错,而指定id后可以通过put创建或者更新文档,只是请求方式变,其他内容不变

二、更新文档

2.1 全量更新

操作说明

  • 和新增文档一样,输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖

命令示例

  1. POST es/_doc/1
  2. {
  3. "title": "华为手机",
  4. "category": "华为",
  5. "images": "http://www.gulixueyuan.com/hw.jpg",
  6. "price": 4999.0
  7. }

返回示例

  1. {
  2. "_index": "es",
  3. "_type": "_doc",
  4. "_id": "1",
  5. "_version"【每修改一次版本号+1】: 7,
  6. "result"updated表示更新】: "updated",
  7. "_shards"【分片信息】: {
  8. "total": 2,
  9. "successful": 1,
  10. "failed": 0
  11. },
  12. "_seq_no": 10,
  13. "_primary_term": 1
  14. }

错误说明

  1. 更新不要忘记_doc,否则将会报错

    • http://{ {ip:port}}/es/1

    {

    1. "error": {
    2. "root_cause": [
    3. {
    4. "type": "illegal_argument_exception",
    5. "reason": "Rejecting mapping update to [es] as the final mapping would have more than 1 type: [_doc, 1]"
    6. }
    7. ],
    8. "type": "illegal_argument_exception",
    9. "reason": "Rejecting mapping update to [es] as the final mapping would have more than 1 type: [_doc, 1]"
    10. },
    11. "status": 400

    }

2.2 增量更新

操作说明

  • 通过指定_doc方式默认是全量更新,如果需要更新指定字段则需要将**_doc改为_update**
  • 请求内容需要增加doc表示,原始{“key”: value},更新{“doc”: {“key”: value}}

命令示例

  1. POST es/_update/1
  2. {
  3. "doc": {
  4. "price": 1999
  5. }
  6. }

返回示例

  1. {
  2. "_index": "es",
  3. "_type": "_doc",
  4. "_id": "1",
  5. "_version": 8,
  6. "result": "updated",
  7. "_shards": {
  8. "total": 2,
  9. "successful": 1,
  10. "failed": 0
  11. },
  12. "_seq_no": 11,
  13. "_primary_term": 1
  14. }
  • 查询结果,看到price已经更新

    {

    1. "_index": "es",
    2. "_type": "_doc",
    3. "_id": "1",
    4. "_version": 8,
    5. "_seq_no": 11,
    6. "_primary_term": 1,
    7. "found": true,
    8. "_source": {
    9. "title": "华为手机",
    10. "category": "华为",
    11. "images": "http://www.gulixueyuan.com/hw.jpg",
    12. "price": 1999
    13. }

    }

错误说明

  1. 不能忘记请求参数中的doc

    • 请求参数

    {

    1. "price": 1999

    }

    • 错误信息

    {

    1. "error": {
    2. "root_cause": [
    3. {
    4. "type": "x_content_parse_exception",
    5. "reason": "[2:3] [UpdateRequest] unknown field [price]"
    6. }
    7. ],
    8. "type": "x_content_parse_exception",
    9. "reason": "[2:3] [UpdateRequest] unknown field [price]"
    10. },
    11. "status": 400

    }

三、查询文档

3.1 单个查询

操作说明

  • 查看文档时,需要指明文档的唯一性标识,类似于 MySQL 中数据的主键查询

命令示例

  1. GET es/_doc/1

返回示例

  1. {
  2. "_index"【索引名称】: "es",
  3. "_type"【索引类型】: "_doc",
  4. "_id"id信息】: "1",
  5. "_version"【当前版本】: 4,
  6. "_seq_no": 7,
  7. "_primary_term": 1,
  8. "found"【查询结果,true表示查找到,false表示未查找到】: true,
  9. "_source"【表示原始数据信息】: {
  10. "title": "小米手机",
  11. "category": "小米",
  12. "images": "http://www.gulixueyuan.com/xm.jpg",
  13. "price": 3999
  14. }
  15. }

错误说明

  1. 文档不存在时found为false

    {

    1. "_index": "es",
    2. "_type": "_doc",
    3. "_id": "12",
    4. "found"【未找到】: false

    }

3.2 查询所有

操作说明

  • 上述只能查询单个,可以查询所有文档
  • 将**_doc/替换为_search**

命令示例

  1. GET es/_search

返回示例

  1. {
  2. "took": 1,
  3. "timed_out": false,
  4. "_shards": {
  5. "total": 1,
  6. "successful": 1,
  7. "skipped": 0,
  8. "failed": 0
  9. },
  10. "hits"【命中统计】: {
  11. "total"【命中总数】: {
  12. "value": 1,
  13. "relation": "eq"
  14. },
  15. "max_score": 1,
  16. "hits"【命中信息】: [
  17. {
  18. "_index": "es",
  19. "_type": "_doc",
  20. "_id": "GBe923kBo6bwxxzxoKxP",
  21. "_score": 1,
  22. "_source": {
  23. "title": "小米手机",
  24. "category": "小米",
  25. "images": "http://www.gulixueyuan.com/xm.jpg",
  26. "price": 3999
  27. }
  28. }
  29. ]
  30. }
  31. }

四、删除文档

4.1 删除单个文档

操作说明

  • 删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)

命令示例

  1. DELETE es/_doc/1

返回示例

  1. {
  2. "_index": "es",
  3. "_type": "_doc",
  4. "_id": "1",
  5. "_version"【删除也会更新版本】: 9,
  6. "result"【删除结果】: "deleted",
  7. "_shards"【分片删除】: {
  8. "total": 2,
  9. "successful": 1,
  10. "failed": 0
  11. },
  12. "_seq_no": 12,
  13. "_primary_term": 1
  14. }

错误说明

  1. 删除不存在的文档

    {

    1. "_index": "es",
    2. "_type": "_doc",
    3. "_id": "1",
    4. "_version": 1,
    5. "result"【文档未找到】: "not_found",
    6. "_shards": {
    7. "total": 2,
    8. "successful": 1,
    9. "failed": 0
    10. },
    11. "_seq_no": 13,
    12. "_primary_term": 1

    }

4.2 条件删除文档

操作说明

  • 一般删除数据都是根据文档的唯一性标识进行删除,实际操作时,也可以根据条件对多条数据进行删除
  • 不指定ID分别增加多条数据,使用创建文档时的脚本

    {

    1. "title": "小米手机",
    2. "category": "小米",
    3. "images": "http://www.gulixueyuan.com/xm.jpg",
    4. "price": 3999

    }

  • 条件查询需要http://{ {ip:port}}/es/_delete_by_query

    • 替换_doc及后的内容为**_delete_by_query**根据query删除
  • 查询请求参数需要使用query字段表示,然后在其中再使用match表示删除匹配的信息
  • 注意:条件删除需要使用POST

命令示例

  1. POST es/_delete_by_query
  2. {
  3. "query": {
  4. "match": {
  5. "price": 3999
  6. }
  7. }
  8. }

返回示例

  1. {
  2. "took": 28,
  3. "timed_out"【是否超时】: false,
  4. "total"【总数量】: 4,
  5. "deleted"【删除数量】: 4,
  6. "batches"【批次】: 1,
  7. "version_conflicts": 0,
  8. "noops": 0,
  9. "retries": {
  10. "bulk": 0,
  11. "search": 0
  12. },
  13. "throttled_millis": 0,
  14. "requests_per_second": -1,
  15. "throttled_until_millis": 0,
  16. "failures": []
  17. }

错误说明

  1. 删除是使用post,不是delete,否则将会报错

    {

    1. "error": "Incorrect HTTP method for uri [/es/_delete_by_query] and method [DELETE], allowed: [POST]",
    2. "status": 405

    }

发表评论

表情:
评论列表 (有 0 条评论,511人围观)

还没有评论,来说两句吧...

相关阅读