Elasticsearch(032):es中Document(文档)之新增文档

一、概述

文档是具体的数据记录,一个文档有点像数据库中的一条记录,文档必须包含在一个索引中。

二、新增文档

2.1 新增语法

#新建映射
PUT example
PUT example/docs/_mapping
{ 
    "properties": { 
        "id": { 
            "type": "long"
        },
        "username": { 
            "type": "text"
        },
        "birthday": { 
            "type": "date"
        }
    }
}
#添加文档
PUT example/docs/1 
{ 
    "id": 1,
    "username": "admin",
    "birthday": "2019-10-10"
}

# 查询所有文档
GET example/docs/_search
{ 
    "query": { 
        "match_all": { }
    }
}

返回结果

{ 
  "_index": "example",
  "_type": "docs",
  "_id": "2",
  "_version": 1,
  "result": "created",
  "_shards": { 
    "total": 2,
    "successful": 2,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

注意:如果ES中存在相同id的文档存在,则更新此文档,不是新增此文档。

其中_shards提供了索引创建的过程的参数。

  • total: 文档被创建时,在多少个分片中进行了操作。包括主分片和副本分片
  • successful: 成功建立索引的分片的数量,当创建成功后,成功创建索引后的分片的数量最少是1
  • failed : 失败建立索引分片的数量

2.2 自动创建索引机制

当创建文档的时候,如果索引不存在,则会自动创建该索引。自动创建的索引会自动映射每个字段的类型。自动创建的字段类型是很灵活的,新的字段类型会自动匹配字段对象的类型。

比如说字符串类型,日期类型。可以通过配置文件设置action_auto_create_index为·false·,这样所有节点的配置文件中禁用自动创建索引功能。通过index_mapper_dynamic为false来禁用自动字段类型映射。当然也可以通过模板进行设置,这里就不做过多介绍。

2.3 版本号

每个文档都有一个版本号,版本号的具体值存在创建索引的返回值_version中。通过版本号可以实现并发版本控制的效果。

如下数据返回值(此时调用的接口是修改文档,后面会讲到)

{ 
  "_index": "example",
  "_type": "docs",
  "_id": "3",
  "_version": 3,
  "result": "updated",
  "_shards": { 
    "total": 2,
    "successful": 2,
    "failed": 0
  },
  "_seq_no": 2,
  "_primary_term": 1
}

版本号是实时更新的,不会存在缓存现象。当操作文档不指定版本号是,则系统不对版本号的一致性进行检查。

2.4 操作类型

系统支持通过参数(op_type=create)强制执行创建索引操作。只有当系统中不存在此文档的时候才会创建成功。如果不指定此操作类型,如果存在此文档则会进行更新操作

示例如下

PUT example/docs/3?op_type=create
{ 
    "id": 3,
    "username": "333333",
    "birthday": "2019-10-11"
}

返回结果如下:报错

{ 
  "error": { 
    "root_cause": [
      { 
        "type": "version_conflict_engine_exception",
        "reason": "[docs][3]: version conflict, document already exists (current version [3])",
        "index_uuid": "5pUTCXlqTAClCqlLnp4-7w",
        "shard": "4",
        "index": "example"
      }
    ],
    "type": "version_conflict_engine_exception",
    "reason": "[docs][3]: version conflict, document already exists (current version [3])",
    "index_uuid": "5pUTCXlqTAClCqlLnp4-7w",
    "shard": "4",
    "index": "example"
  },
  "status": 409
}

如果不指定op_type=create,则上述语句不会报错。进行的则是更新操作。

2.5 自动创建id

当创建文档的时候,如果不指定id,系统则会默认创建id。自动生成的id是一个不会重复的随机数

POST example/docs/
{ 
    "username": "4444",
    "birthday": "2019-10-11"
}

返回结果

{ 
  "_index": "example",
  "_type": "docs",
  "_id": "yhrjfW4Bd0UxYyZzqC4j",
  "_version": 1,
  "result": "created",
  "_shards": { 
    "total": 2,
    "successful": 2,
    "failed": 0
  },
  "_seq_no": 3,
  "_primary_term": 1
}

2.6 分片选择

默认情况下,分片的选择是通过id的散列值进行控制。这个只可以通过router参数进行手动控制。可以在每个操作的基础上直接通过hash函数的值来指定分片的选择。如下。

POST example/docs/?routing=路由的值(动态替换)&pretty
    原文作者:瘦子没有夏天
    原文地址: https://blog.csdn.net/weixin_39723544/article/details/108364839
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞