http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 5290|回复: 3

[Elasticsearch] 2-Elasticsearch-面向文档的数据存储与索引

[复制链接]
发表于 2018-11-29 11:24:24 | 显示全部楼层 |阅读模式


教程目录帖

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" ]
}

到这里基本上就算是介绍完了,大家在使用过程中有什么问题可以发帖子一起交流一下。





1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2018-11-29 11:28:00 | 显示全部楼层
真是难得给力的帖子啊。 学习了!
发表于 2018-11-29 16:11:52 | 显示全部楼层
我只是路过打酱油的。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-25 05:49

© 2014-2021

快速回复 返回顶部 返回列表