一、概述
文档是具体的数据记录,一个文档有点像数据库中的一条记录,文档必须包含在一个索引中。
二、新增文档
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
: 成功建立索引的分片的数量,当创建成功后,成功创建索引后的分片的数量最少是1failed
: 失败建立索引分片的数量
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