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. JavaScript 算术运算符

    处理数值的典型情景是数值计算. ㈠JavaScript 算术运算符 算术运算符对数值(文字或变量)执行算术运算. ㈡算术运算符 典型的算术运算会操作两个数值. ⑴这两个数可以是字面量: var x = ...

  2. sublime text 编辑器的操作

    我一直在用的代码编辑器是sublime text,然后总结了一些相关的操作方法. 一 环境操作 1.放大显示比例:Ctrl+ 2.缩小显示比例:Ctrl- 3.分屏:Alt+ Shift +数字    ...

  3. GooFlow

    目前的下载网址:基于JQUERY的WEB在线流程图设计器GOOFLOW 0.7版

  4. 【UOJ#129】 【NOI2015】寿司晚宴

    题目描述 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同的寿司,编号 ...

  5. Aragorn's Story

    A - Aragorn's Story 直接套 线段树+树剖 板子 代码: // Created by CAD on 2019/8/12. #include <bits/stdc++.h> ...

  6. sass用法总结(持续更新中)

    官网:https://www.sass.hk/ 1,嵌套规则 1.1普通嵌套:Sass 允许将一套 CSS 样式嵌套进另一套样式中,内层的样式将它外层的选择器作为父选择器 1.2父选择器 &: ...

  7. css3 水纹效果(仿写阿里云)

    效果图 什么也不说了,上代码. <!DOCTYPE html> <html> <head> <title>css3 水纹效果</title> ...

  8. auth 认证组件的补充

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...

  9. JMS学习(一)

    转自:https://blog.csdn.net/jiuqiyuliang/article/details/46701559 1.基本概念 JMS是java的消息服务,JMS的客户端之间可以通过JMS ...

  10. LeetCode 34. 搜索范围(search for a range)

    题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值 ...