ElasticSearch初识

本文深入探讨Elasticsearch的起源、架构及关键技术,包括其分布式特性、倒排索引机制、近实时搜索能力以及数据恢复策略。同时,文章还介绍了Elasticsearch在云计算环境下的优势,如稳定、快速和易于使用的特性。

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

一位程序员在失业后,陪妻子在伦敦学习厨师课程。学习期间帮妻子写了一个菜谱搜索引擎,觉得lucene太复杂,就开发封装了一个lucene的开源应用,compass。后来重新工作后,做分布式高性能项目,觉得compass功能不足,于是乎开发了ElasticSearch,实现了lucene的分布式系统。

  1. 分布式搜索引擎

a. 分布式:使用多节点分部存储海量数据,多节点同时提供服务。
b. 搜索:类似百度或谷歌搜索引擎的功能。
c. 数据分析:电商中的销量排行,新闻中的点击访问排行等。

  1. ElasticSearch

a. 一个基于RESTful web接口,底层以Lucene技术的搜索服务器。
b. 提供了一个分布式的全文搜索引擎。
c. 用Java开发,作为Apache许可条款下的开放源码发布。
d. 当前最流行的企业级搜索引擎之一。
e. 设计用于云计算,能够达到近实时搜索,具有稳定,可靠,快速,使用方便等特点。
f. 支持全文检索 。例如搜索商品名包含某关键字的信息。 select * from products where name like ‘%xxx%’
g. 支持结构化检索。例如搜索某种类别的商品信息。 select * from products where category=‘xxx’
h. 支持数据分析。例如分析每个商品种类中有多少商品。 select category_name, count(*) from category group by category_name
i. 海量数据近实时处理。通过分布式实现海量数据近实时处理(海量数据的秒级处理)
j. 常用于维基百科,全文检索,高亮显示,搜索推荐等。

  1. 相关概念

cluster - 集群
a. 集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的。
b. 主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的。因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
c. 默认的集群名称是“elasticsearch”

node - 节点
a. 集群中的一个节点,节点的名字默认是随机分配的。节点名字在运维管理时很重要,节点默认会自动加入一个命名为“elasticsearch”的集群,也就是说如果直接启动多个节点,则自动组成一个命名为“elasticsearch”的集群。当然单节点启动也是一个集群。

primary shards - 主分片
a. 把一个完整的索引分成多个主分片。好处是把一个大的索引拆分成若干个,并分布到不同的节点上,从而构成分布式搜索。
b. 分片的数量只能在索引创建前指定,并且索引创建后不能更改。
c. 如果需要更改主分片(水平扩容),解决方案是:需要重新设置分片数量,重新导入数据

replicas shards - 副本分片
a. 副本的作用一是高可用。提高系统的容错性,当某个节点下的某个分片损坏或丢失时可以从副本中恢复。
b. 副本的作用二提高并发效率。提高es的查询效率,es会自动对搜索请求进行负载均衡。
c. 要求primary shards和replica shards不能在同一个机器上。

recovery - 数据恢复或数据重新分布
a. 有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

gateway - 索引快照的存储方式
a. 默认先把索引存放到内存中,当内存满了时再持久化到本地硬盘。gateway对索引快照进行存储,当es集群关闭再重新启动时就会从gateway中读取索引备份数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。

discovery.zen
a. 自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。

transport
a. 代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。

倒排索引
a. 对数据进行分析,抽取出数据中的词条,以词条作为key,对应数据的存储位置作为value,实现索引的存储。这种索引称为倒排索引。如下图:
在这里插入图片描述
b. 倒排索引不可变。

好处:不需要锁,提升并发能力,避免锁问题。数据不变,可以缓存在OS cache中(前提是cache足够大)。filter cache始终在内存中,因为数据是不可变的。可以通过压缩技术来节省CPU和IO的开销。
坏处:倒排索引不可变,导致了ElasticSearch中的index不可变。只要index的结构发生任何变化,都必须重建索引。

近实时 - NRT(Near Realtime)
a. 从写入数据到可搜索数据有一个延迟(1秒左右,分析写入数据的过程)
b. 基于ES执行搜索和分析可以达到秒级别的响应。

index - 索引(类似mysql中的数据库)
a. 包含若干相似结构的document数据。如:客户索引,订单索引,商品索引等。
b. 一个index分配到多个shard上,primary shard和对应的replica shard不能在同一个节点中存储。

type - 类型(类似mysql中的数据表)
a. 每个索引中都可以有若干type,type是Index中的一个逻辑分类,同一个type中的document都有相同的field。
b. ES6.x版本之后,type概念被弱化,一个index中只能有唯一的一个type。且在7.x版本之后,会删除type定义

document - 文档(类似mysql中的每一行数据)
a. ElasticSearch中的最小数据单元。一个document就是一条数据,一般使用JSON数据结构表示。
b. 每个index下的type中都可以存储多个document。
c. 一个document中有多个field,field就是数据字段。如: {“name”:“张三”, “age”: 20}
d. 不要在document中描述java对象的双向关联关系。在转换为JSON字符串的时候会出现无限递归问题
e. 抽象的理解,不是绝对的概念
在这里插入图片描述

  1. 节点变化时的数据rebalance

节点发生变化时,ElasticSearch的cluster会自动调整每个节点中的数据,也就是shard的重新分配。这个过程就是rebalance。
目的是为了提高性能。理论上,当数据量达到一定级别的时候,每个shard分片上的数据量是均等的。那么每个节点管理的shard数量是均等的情况,ElasticSearch集群才能提供最好的服务性能

在这里插入图片描述

  1. ES中的Mapping

a. Mapping在ElasticSearch中是非常重要的一个概念。决定了一个index中的field的数据存储格式,使用什么分词器解析,是否有子字段,是否需要copy to其他字段等信息。
b. ES中有一些自动的字段数据类型识别。
数字 -> long 长整数
文本 -> text 文本,字符串
特殊格式的字符串(如:2018-01-01) -> 对应的特殊类型(如:date)
字面值true|false -> boolean类型
c. 字段类型概述
核心类型 字符串类型 text,keyword
整数类型 integer,long,short,byte
浮点类型 double,float,half_float,scaled_float
逻辑类型 boolean
日期类型 date
范围类型 range
二进制类型 binary
复合类型 数组类型 array
对象类型 object
嵌套类型 nested
地理类型 地理坐标类型 geo_point
地理地图 geo_shape
特殊类型 IP类型 ip
范围类型 completion
令牌计数类型 token_count
附件类型 attachment
抽取类型 percolator

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值