ES-深入功能
ES中数据是如何组织的?
逻辑设计:
用于索引和搜索的基本单位是文档,可以将其认为是关系数据库里的一行。文档以类型来分组,类型包含若干文档,类似表格包含若干行。最终,一个或多个类型存在于同一索引中,索引是更大的容器,类似数据库。
物理设计:
ES将每个索引划分为分片,每份分片可以在集群中的不同服务器间迁移。

1.理解逻辑设计:文档、类型和索引

1.1文档:ES是面向文档的,这意味着索引和搜索的最小单位是文档。

文档的重要属性:
(1)它是自我包含的:一篇文档同时包含字段和他们的取值。
(2)它可以是层次型的:文档中还包含新的文档。一个字段的取值可以是简单的,例如,location字段的取值可以是字符串。字段还可以包含其他字段和取值,例如location字段可以同事包含城市和街道地址。
(3)它拥有灵活的结构:文档不依赖于预先定义的模式。例如,并非所有的文档都需要description这个字段值,所以可以彻底忽略该字段。但是文档可能需要新的字段,如location的维度和经度。
一篇文档通常是数据的JSON表示。和ES沟通最为广泛使用的方式是HTTP协议的JSON。
文档的ID不必非要是个整数。实际上它是个字符串,并没有限制。可以放置任何对应用有意义的字符。
ES中的文档是无模式的,也就是说并非所有的文档都需要拥有相同的字段,他们不是受限于同一模式的。

1.2类型

类型是文档的逻辑容器,类似于表格是行的容器。在不同的类型中,最好放入不同结构的文档。
每个类型中字段的定义称为映射。如果一个字段不是JSON文档的根节点,在其中搜索时必须指定路径,如:location中的geolocation字段被称为location.geolocation.
如果一篇新近索引的文档拥有一个映射中尚不存在的字段,ES会自动的将新字段加入映射,为了添加这个字段,ES不得不确定它是什么类型,于是ES会进行猜测,如:如果值是7,ES会假设字段是长整型。这种新字段的自动检测也有缺点,因为ES可能猜的不对。例如:在索引了值7之后,可能想再索引hello world,这时由于它是string而不是long,索引就会失败。对于线上环境,最安全的方式是在索引数据之前,就定义好所需的映射。

1.3索引

索引是映射类型的容器。一个ES索引非常像关系型世界的数据库,是独立的大量文档集合。每个索引存储在磁盘上的同组文件中;索引存储了所有映射类型的字段,还有一些设置。如:每个索引有一个称为refresh_interval的设置,定义了新近索引的文档对于搜索可见的时间间隔。从性能的角度来看,刷新操作的代价是非常昂贵的,这也是为什么更新只是偶尔进行。默认是每秒更新一次,而不是每来一篇新的文档就更新一次。ES是准实时的。

2.理解物理设计:节点和分片

默认情况下,每个索引由5个主要分片组成,而每份主要分片又有一个副本,一共10份分片。副本分片对于可靠性和搜索性能很有益处。一份分片是一个目录中的文件,Lucene用这些文件存储索引数据。分片也是ES将数据从一个节点迁移到另一个节点的最小单位。

2.1创建拥有一个或多个节点的集群

一个节点是一个ES的实例。在服务器上启动ES之后,就拥有了一个节点。也可以通过启动多个ES进程,在同一台服务器上拥有多个节点。
多个节点可以加入同一个集群。在多节点的集群上,同样的数据可以再多台服务器上传播。
优点:
有助于ES的性能,因为ES有了更多的资源。
有助于ES的稳定性,如果每份分片至少有1个副本分片,那么任何一个节点都可以宕机,而ES依然可以进行服务,返回所有数据。
默认情况下,可以连接集群中的任一节点并访问完整的数据集。
缺点:
必须确定节点之间能够足够快速的通信,并且不会产生大脑分裂。

1. 当索引一篇文档时发生了什么
a. 首先根据文档ID的散列值选择一个主分片
b. 并将文档发送到该主分片,这份主分片可能位于另一个节点
c. 文档被发送到该主分片的所有副本分片进行索引。这使得副本分片和主分片之间保持数据同步。数据同步使得副本分片可以服务于搜索请求,并在原有主分片无法访问时自动升级为主分片。
2. 搜索索引时发生了什么
ES需要在该索引的完整分片集合中进行查找。这些分片可以使主分片,也可以是副本分片,原因是对应的主分片和副本分片通常包含一样的文档。ES在索引的主分片和副本分片中进行搜索请求的负载均衡,使得副本分片对于搜索性能和容错都有所帮助。
2.2理解主分片和副本分片
分片:ES处理的最小单元。一份分片是Lucene的索引(所以ES的索引由多个Lucene的索引组成):一个包含倒排索引的文件目录。倒排索引的结构使得ES在不扫描所有文档的情况下,就能找出哪些文档包含特定的词条(单词)。
下图是一个分片,是一个Lucene索引、一个倒排索引。它默认存储原始文档的内容,再加上一些额外的信息,如词条字典和词频。

词条字典将每个词条和包含该词条的文档映射起来。搜索的时候,ES没有必要为了某个词条扫描所有的文档,而是根据这个字典快速地识别匹配的文档。
词频使得ES可以快速地获取某篇文档中某个词条出现的次数。这对于计算结果的相关性得分非常重要。
分片可以使主分片,也可以是副本分片,其中副本分片是主分片的完整副本。副本分片用于搜索,或者在原有主分片丢失后称为新的主分片。
ES索引由一个或多个主分片以及零个或多个副本分片构成。副本分片可以在运行的时候进行添加和移除,而主分片不可以。可以在任何时候改变每个分片的副本分片数量,因为副本分片总是可以被创建和移除。这并不适用于索引划分为主分片的数量,在创建索引之前,必须决定主分片的数量。过少的分片将限制可扩展性,但是过多的分片会影响性能。默认设置的5个分片是一个不错的选择。

2.3在集群中分发分片

最简单的ES集群只有一个节点:一台机器上运行着一个ES进程。
水平扩展:随着越来越多的节点被添加到同一个集群中,现有的分片将在所有的节点中进行负载均衡。因此,在那些分片上的索引和搜索请求都可以从额外增加的节点中获益。集群中加入更多节点称为水平扩展,请求会被分发,工作负载会被分摊。
垂直扩展:为ES的节点增加更多硬件资源,可能是为虚拟机分配更多处理器,或是为物理机增加更多的内存,尽管垂直扩展每次都能提升性能,但是它并非总是可行的或经济的。

2.4分布式索引和搜索

接受索引请求的ES节点首先选择文档索引到那个分片。默认的,文档在分片中均匀分布:对于每篇文档,分片是通过其ID字符串的散列决定的。每份分片拥有相同的散列范围,接收新文档的机会均等。一旦目标分片确定,接受请求的节点将文档转发到该分片所在的节点。随后,索引操作在所有目标分片的所有副本分片中进行。在所有可用副本分片完成文档的索引后,索引命令就会成功返回。

在搜索的时候,接受请求的节点将请求转发到一组包含所有数据的分片。ES使用round-robin的轮训机制选择可用的分片(主分片或副本分片),并将搜索请求转发过去。ES从这些分片收集结果,将其聚集到单一的回复,然后将回复返回给客户端应用程序。

默认情况下,搜索请求通过round-robin轮询机制选中主分片和副本分片,其假设集群中所有的节点是同样快的。如果不是如此,可以组织数据或配置分片,防止较慢的节点称为瓶颈。

Elasticsearch-数据的存储、搜索(干货)的更多相关文章

  1. 服务追踪数据使用 RabbitMQ 进行采集 + 数据存储使用 Elasticsearch + 数据展示使用 Kibana

    服务追踪数据使用 RabbitMQ 进行采集 + 数据存储使用 Elasticsearch + 数据展示使用 Kibana https://www.cnblogs.com/xishuai/p/elk- ...

  2. ELK日志分析系统(4)-elasticsearch数据存储

    1. 概述 logstash把格式化的数据发送到elasticsearch以后,elasticsearch负责存储搜索日志数据 elasticsearch的搜索接口还是很强大的,这边不详细展开,因为k ...

  3. 转:在ElasticSearch之下(图解搜索的故事)

    ElasticSearch 2 (9) - 在ElasticSearch之下(图解搜索的故事) 摘要 先自上而下,后自底向上的介绍ElasticSearch的底层工作原理,试图回答以下问题: 为什么我 ...

  4. ElasticSearch 2 (9) - 在ElasticSearch之下(图解搜索的故事)

    ElasticSearch 2 (9) - 在ElasticSearch之下(图解搜索的故事) 摘要 先自上而下,后自底向上的介绍ElasticSearch的底层工作原理,试图回答以下问题: 为什么我 ...

  5. [转] [Elasticsearch] 数据建模 - 处理关联关系(1)

    [Elasticsearch] 数据建模 - 处理关联关系(1) 标签: 建模elasticsearch搜索搜索引擎 2015-08-16 23:55 6958人阅读 评论(0) 收藏 举报 分类: ...

  6. ElasticSearch 2 (18) - 深入搜索系列之控制相关度

    ElasticSearch 2 (18) - 深入搜索系列之控制相关度 摘要 处理结构化数据(比如:时间.数字.字符串.枚举)的数据库只需要检查一个文档(或行,在关系数据库)是否与查询匹配. 布尔是/ ...

  7. ElasticSearch 2 (16) - 深入搜索系列之近似度匹配

    ElasticSearch 2 (16) - 深入搜索系列之近似度匹配 摘要 标准的全文搜索使用TF/IDF处理文档.文档里的每个字段或一袋子词.match 查询可以告诉我们哪个袋子里面包含我们搜索的 ...

  8. ElasticSearch 2 (15) - 深入搜索系列之多字段搜索

    ElasticSearch 2 (15) - 深入搜索系列之多字段搜索 摘要 查询很少是简单的一句话匹配(one-clause match)查询.很多时候,我们需要用相同或不同的字符串查询1个或多个字 ...

  9. ElasticSearch 2 (14) - 深入搜索系列之全文搜索

    ElasticSearch 2 (14) - 深入搜索系列之全文搜索 摘要 在看过结构化搜索之后,我们看看怎样在全文字段中查找相关度最高的文档. 全文搜索两个最重要的方面是: 相关(relevance ...

  10. ElasticSearch 2 (13) - 深入搜索系列之结构化搜索

    ElasticSearch 2 (13) - 深入搜索系列之结构化搜索 摘要 结构化查询指的是查询那些具有内在结构的数据,比如日期.时间.数字都是结构化的.它们都有精确的格式,我们可以对这些数据进行逻 ...

随机推荐

  1. 18.configparser模块

    # 创建配置文件 import configparser config = configparser.ConfigParser() # 相当于config = {} 空字典 config[" ...

  2. 在linux 下安装nginx

    1.编译安装Nginx 官网:http://wiki.nginx.org/Install 下载 # wget http://nginx.org/download/nginx-1.8.0.tar.gz ...

  3. C# 获取文件信息

    string fullPath = @"d:\test\default.avi"; string filename = Path.GetFileName(fullPath);//返 ...

  4. python中oepen及fileobject初步整理之划水篇

    open选项 参考官方文档,很多东西也没有看懂,将自己理解的部分先整理到这里,以后还是要参阅官方文档的. open (file, mode='r', buffering=-1, encoding=No ...

  5. Linux命令-文件管理(二)

    Linux命令-文件管理(二) Linux gitview命令 Linux gitview命令用于观看文件的内容,它会同时显示十六进制和ASCII格式的字码. 语法:gitview [-bchilv] ...

  6. phpfor函数和foreach函数

    PHP for 循环 PHP While 循环 PHP 函数 PHP for 循环执行代码块指定的次数. PHP for 循环 如果您已经提前确定脚本运行的次数,可以使用 for 循环. 语法 for ...

  7. Python argparse 用法总结

    使用argparse的四个基本步骤 创建 ArgumentParser() 对象 调用 add_argument() 方法添加参数 使用 parse_args() 解析添加的参数 # example ...

  8. 20175215 2018-2019-2 第四周Java课程学习总结

    第五章学习内容 1.子类的继承性 (1)子类和父类在同一包中的继承性 如果子类和父类在同一个包中,那么,子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且也自然地继承了父类中 ...

  9. PHP CI 框架简单使用(二)

    我们简单认识一下CI框架的MVC.示例代码如下 //CI控制器文件Home.php <?php defined('BASEPATH') OR exit('No direct script acc ...

  10. fstab中使用设备的uuid

    设备定位的方法有: 设备名称, 如:/dev/sda1, 随着linux内核加载模块顺序在每次启动的时候可能会不同, 在插拔U盘/移动硬盘的时候, 设备分配到的名称可能不同,这样fs映射就会失败 因此 ...