初探 Elasticsearch 概念

135 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

ES 是什么

Elasticsearch 是一个基于Apache Lucene 的分布式搜索和分析引擎,位于 Elastic Stack 核心。它是 Shay Banon 创建,2010年2月发布的。Lucene 更多的是作为一个中间件,而 ES 则是一个成品。

在涉及【索引】【搜索】【分析】的领域有着强大的功能。与之相对,Elastic Stack 中的 Logstash 和 Beats 有助于收集、聚合和丰富数据并将其存储在 Elasticsearch 中。 Kibana 支持我们以交互方式探索、可视化和分享对数据的见解,并管理和监控堆栈。

  • Elasticsearch 为所有类型的数据提供【接近实时】的搜索和分析。
  • 无论是结构化或非结构化文本、数字数据还是地理空间数据,Elasticsearch 都能以支持快速搜索的方式高效地存储和索引它。
  • 随着数据和查询量的增长,Elasticsearch 的分布式特性使业务的部署能够随之无缝增长。

虽然不是每个问题都是搜索问题,但 Elasticsearch 提供了速度和灵活性来处理各种用例中的数据,一些常见的场景如下:

  • 向应用或网站添加搜索框
  • 存储和分析日志、指标和安全事件数据
  • 使用机器学习实时自动建模数据行为
  • 使用 Elasticsearch 作为存储引擎自动化业务工作流程
  • 使用 Elasticsearch 作为地理信息系统 (GIS) 管理、集成和分析空间信息
  • 使用 Elasticsearch 作为生物信息学研究工具来存储和处理遗传数据

作为初探 ES 的业务开发人员,只需要记住一点:

通过ES可以很方便的使大量数据具有搜索、分析和探索的能力。

与关系型数据库对比

Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式。

同时ElasticSearch和关系型数据库比如MySQL有很多相似的概念:

关系型数据库(比如MySQL)非关系型数据库(ElasticSearch)
数据库Database索引Index
表Table类型Type
数据行Row文档Document
数据列Column字段Field
约束Schema映射Mapping

这里,mapping相当于数据库表的定义。

基本概念

索引

ES 的数据总是存储在一个或多个索引中,上面也提到,类似数据库的概念,我们可以向索引进行读写。ES 的索引可能由一个或多个 Lucene 索引构成。

文档

文档是 ES 的主要实体,不管业务的场景如何,最后都会归于对【文档】document 的搜索。一个文档本质上就是一个 json 对象,示例:

{

    "name" :     "John",

    "sex" :      "Male",

    "age" :      25,

    "birthDate": "1990/05/01",

    "about" :    "I love to go rock climbing",

    "interests": [ "sports", "music" ]

}

注意,文档之间可能字段并不相同,没有固定格式结构。ES 的文档最终都会被存为 Lucene 文档。

类型

每个文档都需要有自己对应的类型,对应自己的一套 mapping,类似一个 MySQL 中的 table。

映射

中文里我们叫它映射。只不过实际用的时候,大家一般直接叫 mapping。

所有文档在写入索引前都会被分析,用户可以设置参数决定如何将【输入文本】分割为【词条】,哪些词条应该被过滤等,而 mapping 所要做的就是存储分析链所需的所有信息。

mapping 可以手动配置也可以自动配置。

节点

这是一个物理概念,单个 ES 服务实例就被称为节点(node),生产环境中,我们通常不会只部署单机 ES,而是会部署一个集群。

通常来说节点分为 3 类:

  • 数据节点:持有数据,提供对这些数据的搜索;
  • master 节点:控制其他节点工作,一个集群中只有一个 master;
  • 部落节点:连接多个集群,支持我们在多个集群上执行可以在单集群 ES 上使用的功能。

分片

分片支持了用户推送超过单机容量的数据到 ES 集群,允许系统存储的数据总量超过单机的容量。ES 将数据散布到多个物理 Lucene 索引上,这些索引就被称为 shard(分片)。ES 会自动完成 sharding 处理,大家可以类比为我们在 MySQL 使用的分片库。

需要注意的是,分片数量在索引创建时就被配置好了,无法再改。所以参数调优也是很重要的。

副本

与分片相对,副本则是为了解决访问请求量大时,单机扛不住的问题。本质是冗余的思路。每个 shard 创建多个冗余副本。处理查询的时候,可以把这些副本当成主分片使用。

若主分片宕机,ES 也会自动从该分片副本中选出一个新的作为主分片。而且我们可以随着业务需要,在任意时间添加或删除副本,非常方便。