es-深入理解-01

文章内容摘自极客时间《Elasticsearch核心技术与实战》与《Elasticsearch实战》

深入理解 Elasticsaerch

从两个角度来理解es中数据是如何组织的

  • 逻辑设计
    • 搜索应用所需要注意的。 用于索引和搜索的基本单位是文档,可以将其认为是关系数据库里的一行数据,索引更像是关系型数据库的一张表。
  • 物理设计
    • 在后台es是如何处理数据的es将每个索引划分为分片,每份分片可以在集群的不同服务器间迁移。通常,应用程序无须关心这些,因为无论是单台还是多台服务器,应用和es的交互基本保持不变。但是,开始管理集群的时候,就需要留心了。原因是,物理设计的配置方式决定了集群的性能,可扩展性和可用性。

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

  • 文档
    • 文档是索引和搜索数据的最小单位
    • 一篇文档同时包含字段和它的取值
    • 文档可以是多层次的,一个字段的取值可以是简单的(例如字符串),也可以是包含其他字段和取值
    • 拥有灵活的结构,文档不依赖于预先定义的模式,并非所有的文档都需要拥有相同的字段,它们不是受限于同一个模式
    • 每个文档都有一个unique id,可指定或自动生成

文档的元数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"_index": "movies", // 文档所属的索引名
"_type": "_doc", // 文档所属的类型名
"_id": "1", // 文档的唯一id
"_score": 14.93223, // 相关性打分
"_source": { // 文档的原始json数据
"year": 1992,
"@version": 1,
"genre": [
"Adventure",
"Animation",
"Children",
"Cimedy",
"Fantasy"
],
"id": 1,
"title": "toy Story"
}
}
  • 类型
    • 在老版本一个索引可设置多个类型,新版本已经去除

下面是摘自官方的说明

在Elasticsearch 6.0.0或更高版本中创建的索引可能只包含单一的映射类型。在5.x中创建具有多种映射类型的索引将继续像Elasticsearch 6.x一样发挥作用。类型将在Elasticsearch 7.0.0的API中不建议使用,并在8.0.0中完全删除。

  • 索引
    • 索引是文档的容器,是一类文档的集合
    • 每个索引都有自己的mapping的定义,用于包含文档的字段名和字段类型
    • 每个索引存储在磁盘的同组文件中;索引存储了所有映射类型的字段,还有一些配置
    • 每一个索引都有一个refresh_interval的设置,定义了新近索引的文档对于搜索可见的时间间隔,默认是每秒更新一次
    • 同一个索引是由一个或多个称为分片的数据块组成

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

  • 节点

    • 一个节点就是一个es实例,多个es节点组成es集群
  • 分片

    • 分片是组成索引的数据块
    • 分片是es将数据从一个节点迁移到另一个节点的最小单位
    • 主分片
      • 用以解决数据水平扩展问题。通过主分片,可以将数据分布到集群的所有节点之上
      • 一个分片是一个运行的lucene实例
      • 主分片数在创建时指定,后续不需修改,除非reindex
    • 副本分片
      • 副本分片数,可以动态调整
      • 增加副本数,还可以在一定程度上提高服务的可用性(读取的吞吐)

抽象与类比

拿传统的关系型数据库和elasticsearch做一下类比:

RDBMS Elasticsearch
Table index(type)
Row Document
Column Field
Schema Mapping
SQL DSL

索引一篇文章时发生了什么

默认情况下,当索引一篇文章时,首先根据文档ID的散列值选择一个主分片,并将文档发送到该主分片。这份主分片可能位于另一个节点
es/es1

然后文档被发送到该主分片的所有副本分片进行索引。这使得副本分片和主分片之前保持数据的同步。数据同步使得副本分片可以服务于搜索请求,并在原有主分片无法访问时自动升级为主分片。

搜索时发生了什么

当搜索一个索引时,es需要在该索引的完整分片中进行查找,这些分片可以是主分片,也可以是副本分片,原因是对应的主分片和副本分片通常包含一样的文档

什么是倒排索引

一个倒排索引由文档中所有不重复词的列表构成,对于其中的每一个词,都有一个包含他的文档列表
es/es2

图书和倒排索引的类比

  • 图书
    • 正排索引 - 目录页
    • 倒排索引 - 索引页
  • 搜索引擎
    • 正排索引 - 文档id到文档内容和单词的关联
    • 倒排索引 - 单词到文档id的关系

倒排索引的核心组成

  • 倒排索引包含两个部分
    • 单词词典(Term Dictionary),记录所有文档的单词,记录单词到倒排列表的关联关系
      • 单词词典一般比较大,可以通过B+树或哈希拉链法实现,已满足高性能的插入与查询
    • 倒排列表(Posting List)-记录了单词对应的文档结合,由倒排索引项组成
      • 倒排索引项(posting)
        • 文档id
        • 词频TF -该单词所在文档中出现的次数,用于相关性评分
        • 位置(Position)-单词在文档中分词的位置。用于语句搜索(phrase query)
        • 偏移(offset) -记录单词的开始结束位置,实现高亮显示

一个例子 - Elasticsearch
es/es3

  • Elasticsearch 的json文档中的每个字段,都有自己的倒排索引
  • 可以指定对某些字段不做索引
    • 优点:节省存储空间
    • 缺点:字段无法被搜索

es-深入理解-01
http://example.com/2022/11/05/es/es-深入理解-01/
作者
weijun Wu
发布于
2022年11月5日
许可协议