🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 什么是文档? 程序中大多的实体或对象能够被序列化为包含键值对的JSON对象,**键(key)**是**字段(field)**或**属性(property)**的名字,**值(value)**可以是字符串、数字、布尔类型、另一个对象、值数组或者其他特殊类型,比如表示日期的字符串或者表示地理位置的对象。 ```Javascript { "name": "John Smith", "age": 42, "confirmed": true, "join_date": "2014-06-01", "home": { "lat": 51.5, "lon": 0.1 }, "accounts": [ { "type": "facebook", "id": "johnsmith" }, { "type": "twitter", "id": "johnsmith" } ] } ``` 通常,我们可以认为**对象(object)**和**文档(document)**是等价相通的。不过,他们还是有所差别:对象(Object)是一个JSON结构体——类似于哈希、hashmap、字典或者关联数组;对象(Object)中还可能包含其他对象(Object)。 在Elasticsearch中,**文档(document)**这个术语有着特殊含义。它特指最顶层结构或者**根对象(root object)**序列化成的JSON数据(以唯一ID标识并存储于Elasticsearch中)。 ## 文档元数据 一个文档不只有数据。它还包含了**元数据(metadata)**——**关于**文档的信息。三个必须的元数据节点是: | 节点 | 说明 | | -------- | ------------------ | | `_index` | 文档存储的地方 | | `_type` | 文档代表的对象的类 | | `_id` | 文档的唯一标识 | ### `_index` **索引(index)**类似于关系型数据库里的“数据库”——它是我们存储和索引关联数据的地方。 > 提示: > 事实上,我们的数据被存储和索引在**分片(shards)**中,索引只是一个把一个或多个分片分组在一起的逻辑空间。然而,这只是一些内部细节——我们的程序完全不用关心分片。对于我们的程序而言,文档存储在**索引(index)**中。剩下的细节由Elasticsearch关心既可。 我们将会在《索引管理》章节中探讨如何创建并管理索引,但现在,我们将让Elasticsearch为我们创建索引。我们唯一需要做的仅仅是选择一个索引名。这个名字必须是全部小写,不能以下划线开头,不能包含逗号。让我们使用`website`做为索引名。 ### `_type` 在应用中,我们使用对象表示一些“事物”,例如一个用户、一篇博客、一个评论,或者一封邮件。每个对象都属于一个**类(class)**,这个类定义了属性或与对象关联的数据。`user`类的对象可能包含姓名、性别、年龄和Email地址。 在关系型数据库中,我们经常将相同类的对象存储在一个表里,因为它们有着相同的结构。同理,在Elasticsearch中,我们使用相同**类型(type)**的文档表示相同的“事物”,因为他们的数据结构也是相同的。 每个**类型(type)**都有自己的**映射(mapping)**或者结构定义,就像传统数据库表中的列一样。所有类型下的文档被存储在同一个索引下,但是类型的**映射(mapping)**会告诉Elasticsearch不同的文档如何被索引。 我们将会在《映射》章节探讨如何定义和管理映射,但是现在我们将依赖Elasticsearch去自动处理数据结构。 `_type`的名字可以是大写或小写,不能包含下划线或逗号。我们将使用`blog`做为类型名。 ### `_id` **id**仅仅是一个字符串,它与`_index`和`_type`组合时,就可以在Elasticsearch中唯一标识一个文档。当创建一个文档,你可以自定义`_id`,也可以让Elasticsearch帮你自动生成。 ### 其它元数据 还有一些其它的元数据,我们将在《映射》章节探讨。使用上面提到的元素,我们已经可以在Elasticsearch中存储文档并通过ID检索——换言说,把Elasticsearch做为文档存储器使用了。