Elasticsearch的介绍与基本概念(增,删,改,查)等一系列问题

本文介绍了Elasticsearch,一个基于Lucene的全文搜索引擎,适用于搜索、日志管理和数据分析等领域。Elasticsearch是分布式、支持RESTful API的,可水平扩展。文章深入探讨了索引、类型、文档、节点和分片等基本概念,以及增删改查的原理。此外,文章还讨论了Elasticsearch与关系型数据库的区别,并列举了其在实时检索、日志分析和商业智能查询等场景的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. Elasticsearch介绍

1、什么是 Elasticsearch ?

  • 使用 java 语言开发的一套开源的全文搜索引擎,建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎
  • 用于搜索、日志管理、安全分析、指标分析、业务分析、应用性能监控等多个领域
  • 底层基于 Lucene 开源库开发,提供 restAPI,可以被任何语言调用
  • 支持分布式部署,可水平扩展
  • 更新迭代快、社区活跃、文档丰富

2、es功能

  • 分布式的搜索引擎和数据分析引擎
  • 数据分析:电商网站,最近7天牙膏销量排行前十商家(举例)
  • 全文检索,结构化检索,数据分析
  • 全文检索:我想搜索商品名称包含牙膏的商品,select * from products where product_name like
    “%牙膏%”
  • 结构化检索:我想搜索商品分类为日化用品的商品都有哪些,select * from products where
    category_id=’日化用品’
  • 部分匹配、自动完成、搜索纠错、搜索推荐
  • 数据分析:我们分析每一个商品分类下有多少个商品,select category_id,count(*) from products
    group by category_id
  • 对海量数据进行实时的处理

3、es特点

  • 可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上,服务小公司
  • Elasticsearch不是什么新技术,主要是将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的ES;
  • lucene(全文检索),商用的数据分析软件(也是有的),分布式数据库(mycat)
  • 对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接3分钟部署一下ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂
  • 数据库的功能面对很多领域是不够用的(事务,还有各种联机事务型的操作);
  • 特殊的功能,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;
  • Elasticsearch作为传统数据库的一个补充,提供了数据库所不不能提供的很多功能

二. elasticsearch基本概念

1、概念说明

  • ElasticSearch 是分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个实例。
  • 单个实例称为一个节点(node)
  • 一组节点构成一个集群(cluster)。
  • 分片是底层的工作单元,文档保存在分片内,分片又被分配到集群内的各个节点里,每个分片仅保存全部数据的一部分。
    在这里插入图片描述

2、索引(Index)[数据库]

  • ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。
  • 类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库,或者一个数据存储方案(schema)。
  • 索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。
  • 一个ES集群中可以按需创建任意数目的索引。

3、类型(Type)[表]

  • 类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。
  • 因此,一个索引内部可定义一个或多个类型(type)。
  • 一般来说,类型就是为那些拥有相同的域的文档做的预定义。
  • 例如,在索引中,可以定义一个用于存储用户数据的类型,一个存储日志数据的类型,以及一个存储评论数据的类型。
  • 类比传统的关系型数据库领域来说,类型相当于“表”。

4、文档(Document)

  • 文档是索引和搜索的原子单位,它是包含了一个或多个域(Field)的容器,基于JSON格式进行表示。
  • 文档由一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为“多值域”。
  • 每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。

5、节点(Node)

  • 一个运行中的 Elasticsearch 实例称为一个节点
  • 而集群是由一个或者多个拥有相同cluster.name配置的节点组成, 它们共同承担数据和负载的压力。
  • ES集群中的节点有三种不同的类型:
    • 主节点:负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。
      主节点并不需要涉及到文档级别的变更和搜索等操作。可以通过属性node.master进行设置。
    • 数据节点:存储数据和其对应的倒排索引,默认每一个节点都是数据节点(包括主节点),可以通过node.data属性进行设置。
    • 协调节点:如果node.master和node.data属性均为false,则此节点称为协调节点,用来响应客户请求,均衡每个节点的负载。

6、分片(Shard)

  • 一个索引中的数据保存在多个分片中,相当于水平分表。
  • 一个分片便是一个Lucene 的实例,它本身就是一个完整的搜索引擎。
  • 我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。
  • ES实际上就是利用分片来实现分布式。
  • 分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。
  • 当你的集群规模扩大或者缩小时, ES会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。
  • 主分片 与 副分片:
    • 索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。
    • 一个副本分片只是一个主分片的拷贝。
    • 副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。

三. elasticsearch增删改查原理

1、增加原理

  • 当用户向一个节点提交了一个索引新文档的请求,节点会计算新文档应该加入到哪个分片(shard)中。
  • 每个节点都存储有每个分片存储在哪个节点的信息,因此协调节点会将请求发送给对应的节点。
  • 注意这个请求会发送给主分片,等主分片完成索引,会并行将请求发送到其所有副本分片,保证每个分片都持有最新数据。
  • 每次写入新文档时,都会先写入内存中,并将这一操作写入一个translog文件(transaction
    log)中,此时如果执行搜索操作,这个新文档还不能被索引到。
  • ES会每隔1秒时间(这个时间可以修改)进行一次刷新操作(refresh)
  • 此时在这1秒时间内写入内存的新文档都会被写入一个文件系统缓存(filesystem cache)中,并构成一个分段(segment)。
  • 此时这个segment里的文档可以被搜索到,但是尚未写入硬盘,即如果此时发生断电,则这些文档可能会丢失。
  • 不断有新的文档写入,则这一过程将不断重复执行。每隔一秒将生成一个新的segment,而translog文件将越来越大。
  • 不断有新的文档写入,则这一过程将不断重复执行。每隔一秒将生成一个新的segment,而translog文件将越来越大。

说明:

  • 由上面的流程可以看出,在两次fsync操作之间,存储在内存和文件系统缓存中的文档是不安全的,一旦出现断电这些文档就会丢失。
  • 所以ES引入了translog来记录两次fsync之间所有的操作,这样机器从故障中恢复或者重新启动,ES便可以根据translog进行还原。

2、删除(Delete)文档

  • ES的索引是不能修改的,因此更新和删除操作并不是直接在原索引上直接执行。
  • 每一个磁盘上的segment都会维护一个del文件,用来记录被删除的文件。
  • 每当用户提出一个删除请求,文档并没有被真正删除,索引也没有发生改变,而是在del文件中标记该文档已被删除。
  • 因此,被删除的文档依然可以被检索到,只是在返回检索结果时被过滤掉了。
  • 每次在启动segment合并工作时,那些被标记为删除的文档才会被真正删除。

3、更新(Update)

  • 更新文档会首先查找原文档,得到该文档的版本号。
  • 然后将修改后的文档写入内存,此过程与写入一个新文档相同。
  • 同时,旧版本文档被标记为删除,同理,该文档可以被搜索到,只是最终被过滤掉。

4、读操作(Read):查询过程

  • 查询的过程大体上分为查询(query)和取回(fetch)两个阶段。
  • 这个节点的任务是广播查询请求到所有相关分片,并将它们的响应整合成全局排序后的结果集合,这个结果集合会返回给客户端。

查询阶段:

  • 当一个节点接收到一个搜索请求,则这个节点就变成了协调节点。
  • 第一步是广播请求到索引中每一个节点的分片拷贝。
  • 协调节点会将所有分片的结果汇总,并进行全局排序,得到最终的查询排序结果。

取回阶段:

  • 查询过程得到的是一个排序结果,标记出哪些文档是符合搜索要求的,此时仍然需要获取这些文档返回客户端。
  • 协调节点会确定实际需要返回的文档,并向含有该文档的分片发送get请求;
  • 分片获取文档返回给协调节点;协调节点将结果返回给客户端。

四. 问题

1、ElasticSearch中的集群、节点、索引、文档、类型是什么?

  • 群集是一个或多个节点(服务器)的集合,它们共同保存您的整个数据,并提供跨所有节点的联合索引和搜索功能。群集由唯一名称标识,默认情况下为“elasticsearch”。此名称很重要,因为如果节点设置为按名称加入群集,则该节点只能是群集的一部分。
  • 节点是属于集群一部分的单个服务器。它存储数据并参与群集索引和搜索功能。
  • 索引就像关系数据库中的“数据库”。它有一个定义多种类型的映射。索引是逻辑名称空间,映射到一个或多个主分片,并且可以有零个或多个副本分片。 MySQL =>数据库 ElasticSearch =>索引
  • 文档类似于关系数据库中的一行。不同之处在于索引中的每个文档可以具有不同的结构(字段),但是对于通用字段应该具有相同的数据类型。 MySQL => Databases => Tables => Columns / Rows ElasticSearch => Indices => Types =>具有属性的文档
  • 类型是索引的逻辑类别/分区,其语义完全取决于用户。

2、ElasticSearch的使用场景

  • 实时检索并且自动提供一些搜索建议
  • 收集日志或或者分析统计数据(ELK)
  • 使用ElasticSearch聚合功能,依靠数据执行复杂的商业智能查询。
  • 一个线上商城系统,用户需要搜索商城上的商品。在这里你可以用es存储所有的商品信息和库存信息,用户只需要输入”空调”就可以搜索到他需要搜索到的商品。
  • 一个运行的系统需要收集日志,用这些日志来分析、挖掘从而获取系统业务未来的趋势。你可以用logstash(elk中的一个产品,elasticsearch/logstash/kibana)收集、转换你的日志,并将他们存储到es中。一旦数据到达es中,就你可以在里面搜索、运行聚合函数等操作来挖掘任何你感兴趣的信息。
  • 如果你有想基于大量数据(数百万甚至数十亿的数据)快速调查、分析并且要将分析结果可视化的需求。你可以用es来存储你的数据,用kibana构建自定义的可视化图形、报表,为业务决策提供科学的数据依据。

3、和关系型数据库对比

在这里插入图片描述
说明:

  • 关系型数据库中的数据库(database),等价于ES中的索引(Index)一个数据库下面有N张表(table),等价于1个索引Index下面有N多类型(Type)
  • 一个数据库表(Table)下的数据由多行(Row)多列(Column,属性)组成,等价于1个Type由多个文档(Document)和多个(Field)组成。
  • 在一个关系型数据库里面,schema定义了表、每个表的字段,还有表和字段之间的关系。与之对应的,在ES中:Mapping定义索引下的Type的字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等。
  • 在数据库中的增insert、删delete、改update、查search操作对应着ES中的增Put/Post、删Delete、改Update、查Get。

4、为什么选择ElasticSearch ?

  • 项目需要提升检索质量,ElasticSearch 在大多数应用的性能方面优于solr ;
    对比过程可以查阅:ElasticSearch与Solr搜索引擎特性对比-new
  • 上手非常简单,学习成本小
  • 社区活跃,资料比较多,更新频繁
  • 用户众多,可以利用高扩展特性根据自身需求进行灵活的配置。

使用的优秀案例:

  • 2013年初,GitHub抛弃了Solr,采取ElasticSearch 来做PB级的搜索。
    “GitHub使用ElasticSearch搜索20TB的数据,包括13亿文件和1300亿行代码”
  • 维基百科:启动以elasticsearch为基础的核心搜索架构。
  • SoundCloud:“SoundCloud使用ElasticSearch为1.8亿用户提供即时而精准的音乐搜索服务”。
  • 百度:百度目前广泛使用ElasticSearch作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据,通过对各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。目前覆盖百度内部20多个业务线(包括casio、云分析、网盟、预测、文库、直达号、钱包、风控等),单集群最大100台机器,200个ES节点,每天导入30TB+数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值