教程目录帖
http://www.sufeinet.com/thread-24643-1-1.html
Elasticsearch-面向文档的数据存储与索引
面向文档
面向文档的开发,或者是存储,在以后的互联网大数据应用当中,将成为必然,现在随时互联网的飞速发展,以后我们想做个系统 ,没有大数据框架,没有云平台这样的关键字,都不好意思 拿出手,正是因为数据的飞速增长,获取迅速,处理及时,才让互联网在这几年突飞猛进。
关系型存储并不是没有前景,但一定不会有对象存储的前景更好。更适合这个互联网新时代
在一个应用程序中,你很少发现只是一个简单的键值的列表,一般情况 下,他们都会有复杂的数据结构组成。这与数据的多少无关,可能是一个日期,一个地理位置,也可能是一系列的数组,如果你想把这些东西存储到一个关系类型的数据库中,这就相当于是把一个表现力丰富的对象,挤压到一个表格中。
首先我们需要扁平化,拆分结构,并建立关系,而查询的时候又必须要组织成一个对象。这是个复杂的过程。
很庆幸的是Elasticsearch使用的是面向文档的存储方式,这意味着你可以将整个对象存储到Elasticsearch中,而且他不仅仅是存储对象,还会对每个文档的内容进行索引化,在Elasticsearch中可以对文档进行索引,查询,排序,过滤,而不是对行列数据进行操作。这将是一种完全不同的数据考量方式。也是Elasticsearch能支持复杂全文索引的真正原因。
Json
Elasticsearch 使用 JavaScript Object Notation 或者 JSON 作为文档的序列化格式。JSON 序列化被大多数编程语言所支持,并且已经成为 NoSQL 领域的标准格式。 它简单、简洁、易于阅读。 考虑一下这个 JSON 文档,它代表了一个 user 对象: [Shell] 纯文本查看 复制代码 {
"email": "john@smith.com",
"first_name": "John",
"last_name": "Smith",
"info": {
"bio": "Eco-warrior and defender of the weak",
"age": 25,
"interests": [ "dolphins", "whales" ]
},
"join_date": "2014/05/01"
}
虽然原始的 [size=0.9em]user 对象很复杂,但这个对象的结构和含义在 JSON 版本中都得到了体现和保留。在 Elasticsearch 中将对象转化为 JSON 并做索引要比在一个扁平的表结构中做相同的事情简单的多。
几乎所有的语言都有相应的模块可以将任意的数据结构或对象 转化成 JSON 格式,只是细节各不相同。
具体请查看 serialization 或者 marshalling 这两个 处理 JSON 的模块。官方 Elasticsearch 客户端 自动为您提供 JSON 转化。
我们就将雇员信息存储做为第一个测试需求
存储雇员数据。 这将会以 雇员文档 的形式存储:一个文档代表一个雇员。存储数据到 Elasticsearch 的行为叫做 索引 , 但在索引一个文档之前,需要确定将文档存储在哪里。 一个 Elasticsearch 集群可以 包含多个 索引 ,相应的每个索引可以包含多个 类型 。 这些不同的类型存储着多个 文档 ,每个文档又有 多个 属性 。 关于索引 [C#] 纯文本查看 复制代码 你也许已经注意到 索引 这个词在 Elasticsearch 语境中包含多重意思, 所以有必要做一点儿说明:
索引(名词):
如前所述,一个 索引 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方。 索引 (index) 的复数词为 indices 或 indexes 。
索引(动词):
索引一个文档 就是存储一个文档到一个 索引 (名词)中以便它可以被检索和查询到。这非常类似于 SQL 语句中的 INSERT 关键词,除了文档已存在时新文档会替换旧文档情况之外。
倒排索引:[/align][align=left]
关系型数据库通过增加一个 索引 比如一个 B树(B-tree)索引 到指定的列上,以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做 倒排索引 的结构来达到相同的目的。
+ 默认的,一个文档中的每一个属性都是 被索引 的(有一个倒排索引)和可搜索的。一个没有倒排索引的属性是不能被搜索到的。我们将在 倒排索引 讨论倒排索引的更多细节。 对于雇员目录,我们将做如下操作: - 每个雇员索引一个文档,包含该雇员的所有信息。
- 每个文档都将是 [size=0.9em]employee 类型 。
- 该类型位于 索引 [size=0.9em]megacorp 内。
- 该索引保存在我们的 Elasticsearch 集群中。
实践中这非常简单(尽管看起来有很多步骤),我们可以通过一条命令完成所有这些动作: [Shell] 纯文本查看 复制代码 PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
} 注意,路径 /megacorp/employee/1 包含了三部分的信息: megacorp索引名称employee类型名称1特定雇员的ID
请求体 —— JSON 文档 —— 包含了这位员工的所有详细信息,他的名字叫 John Smith ,今年 25 岁,喜欢攀岩。 很简单!无需进行执行管理任务,如创建一个索引或指定每个属性的数据类型之类的,可以直接只索引一个文档。Elasticsearch 默认地完成其他一切,因此所有必需的管理任务都在后台使用默认设置完成。 进行下一步前,让我们增加更多的员工信息到目录中: [Shell] 纯文本查看 复制代码 PUT /megacorp/employee/2
{
"first_name" : "Jane",
"last_name" : "Smith",
"age" : 32,
"about" : "I like to collect rock albums",
"interests": [ "music" ]
}
PUT /megacorp/employee/3
{
"first_name" : "Douglas",
"last_name" : "Fir",
"age" : 35,
"about": "I like to build cabinets",
"interests": [ "forestry" ]
}
到这里基本上就算是介绍完了,大家在使用过程中有什么问题可以发帖子一起交流一下。
|