文档是什么?

在很多程序中,大部分实体或者对象都被序列化为包含键和值的JSON对象。是一个字段或者属性的名字,可以是一个字符串、数字、布尔值、对象、数组或者是其他的特殊类型,比如代表日期的字符串或者代表地理位置的对象:

  1. {
  2. "name": "John Smith",
  3. "age": 42,
  4. "confirmed": true,
  5. "join_date": "2014-06-01",
  6. "home": {
  7. "lat": 51.5,
  8. "lon": 0.1
  9. },
  10. "accounts": [
  11. {
  12. "type": "facebook",
  13. "id": "johnsmith"
  14. },
  15. {
  16. "type": "twitter",
  17. "id": "johnsmith"
  18. }
  19. ]
  20. }

通常情况下,我们使用可以互换对象和文档。然而,还是有一个区别的。对象(object )仅仅是一个JSON对象,类似于哈希,哈希映射,字典或关联数组。对象(Objects)则可以包含其他对象(Objects)。

在Elasticsearch中,文档这个单词有特殊的含义。它指的是在Elasticsearch中被存储到唯一ID下的由最高级或者根对象 (root object )序列化而来的JSON。

文档元数据

一个文档不只包含了数据。它还包含了元数据(metadata) —— 关于文档的信息。有三个元数据元素是必须存在的,它们是:

名字 说明
_index 文档存储的地方
_type 文档代表的对象种类
_id 文档的唯一编号

_index

索引 类似于传统数据库中的”数据库”——也就是我们存储并且索引相关数据的地方。


TIP:

在Elasticsearch中,我们的数据都在分片中被存储以及索引,索引只是一个逻辑命名空间,它可以将一个或多个分片组合在一起。然而,这只是一个内部的运作原理——我们的程序可以根本不用关心分片。对于我们的程序来说,我们的文档存储在索引中。剩下的交给Elasticsearch就可以了。


我们将会在《索引管理》章节中探讨如何创建并管理索引。但是现在,我们只需要让Elasticsearch帮助我们创建索引。我们只需要选择一个索引的名字。这个名称必须要全部小写,也不能以下划线开头,不能包含逗号。我们可以用website作为我们索引的名字。

_type

在程序中,我们使用对象代表“物品”,比如一个用户、一篇博文、一条留言或者一个邮件。每一个对象都属于一种类型,类型定义了对象的属性或者与数据的关联。用户类的对象可能就会包含名字、性别、年龄以及邮箱地址等。

在传统的数据库中,我们总是将同类的数据存储在同一个表中,因为它们的数据格式是相同的。同理,在Elasticsearch中,我们使用同样类型的文档来代表同类“事物”,也是因为它们的数据结构是相同的。

每一个类型都拥有自己的映射(mapping)或者结构定义,它们定义了当前类型下的数据结构,类似于数据库表中的列。所有类型下的文档会被存储在同一个索引下,但是映射会告诉Elasticsearch不同的数据应该如何被索引。

我们将会在《映射》中探讨如何制定或者管理映射,但是目前为止,我们只需要依靠Elasticsearch来自动处理数据结构。

_id

id是一个字符串,当它与_index以及_type组合时,就可以来代表Elasticsearch中一个特定的文档。我们创建了一个新的文档时,你可以自己提供一个_id,或者也可以让Elasticsearch帮你生成一个。

其他元数据

在文档中还有一些其他的元数据,我们将会在《映射》章节中详细讲解。使用上面罗列的元素,我们已经可以在Elasticsearch中存储文档或者通过ID来搜索已经保存的文档了。