ElasticSearch理解总结

目录

一、ElasticSearch前序概念

二、什么是ElasticSearch

三、应用场景

四、ElasticSearch技术分解


一、ElasticSearch前序概念

1.1数据分类
1、结构化数据
也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。指具有固定格式或有限长度的数据,如数据库,元数据等。
2、非结构化数据
 又可称为全文数据,不定长或无固定格式,不适于由数据库二维表来表现,包括所有格式的办公文档、XML、HTML、Word 文档,邮件,各类报表、图片和咅频、视频信息等。
注意:如果要更细致的区分的话,XML、HTML 可划分为半结构化数据。因为它们也具有自己特定的标签格式,所以既可以根据需要按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。

1.2数据搜索
1、顺序扫描
按照顺序扫描的方式查询特定的关键字。
在报纸中“平安”的文字在哪些地方出现过。顺序扫描需要从头到尾把报纸阅读扫描一遍然后标记出关键字在哪些版块出现过以及它的出现位置。
这种方式无疑是最耗时的最低效的。
2、全文搜索
将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。
这种方式就构成了全文检索的基本思路。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之为索引。
这种方式的主要工作量在前期索引的创建,但是对于后期搜索却是快速高效的。

1.3关于Lucene

Lucene 只是一个工具包,并不是一个完整的全文检索引擎。
其目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
目前以 Lucene 为基础建立的开源可用全文搜索引擎主要是 Solr 和 Elasticsearch。

二、什么是ElasticSearch

2.1 ElasticSearch概念

使用 Java 编写的一种开源搜索引擎,它在内部使用 Lucene 做索引与搜索,通过对 Lucene 的封装,隐藏了 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。

Elasticsearch不是什么新技术,主要是将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的ES;lucene(全文检索),商用的数据分析软件(也是有的),分布式数据库(mycat)。

2.2 ElasticSearch特点
1、分布式的实时文档存储,每个字段可以被索引与搜索
2、分布式实时分析搜索引擎。
3、胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据。
4、开箱即用的,快速部署一下ES,可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂。
5、数据库的功能面对很多领域是不够用的(事务,还有各种联机事务型的操作);特殊的功能,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;Elasticsearch作为传统数据库的一个。

2.3 ElasticSearch功能
1、分布式的搜索引擎和数据分析引擎
搜索:百度,网站的站内搜索,IT系统的检索
数据分析:电商网站,最近一周手机商品销量排名前10的商家有哪些;新闻网站,最近1个月访问量排名前3的新闻版块是哪些
2、 全文检索,结构化检索,数据分析
a.全文检索
我想搜索商品名称包含手机的商品,select * from products where product_name like "%手机%"
b.结构化检索
我想搜索商品分类为电子数码的商品都有哪些,select * from products where category_id='电子数码'
c.部分匹配、自动完成、搜索纠错、搜索推荐
数据分析:我们分析每一个商品分类下有多少个商品,select category_id,count(*) from products group by category_id
3、对海量数据进行近实时的处理
a.分布式
ES自动可以将海量数据分散到多台服务器上去存储和检索
b.海量数据的处理
分布式以后,就可以采用大量的服务器去存储和检索数据,自然而然就可以实现海量数据的处理了
c.近实时
检索个数据要花费1小时(这就不要近实时,离线批处理,batch-processing);在秒级别对数据进行搜索和分析
d.与分布式/海量数据相反的
lucene,单机应用,只能在单台服务器上使用,最多只能处理单台服务器可以处理的数据量

三、应用场景

以下场景均为“可以用”,并非“需要用”,甚至“必须用”,没有最合适的技术,只有最合适的技术匹配,具体场景具体分析。

1、搜索平台
百度、google、维基百科想建立搜索平台,构建全文检索、高亮、搜索推荐
2、新闻内容类网站
搜狐、Guardian等,可对用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)
3、论坛
CSDN、Stack Overflow等;IT问题,程序的报错,提交上去,有人会跟你讨论和回答,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案。
4、开源代码管理
GitHub、Gitee等,搜索上千亿行代码。
5、电商网站
检索商品等
6、日志数据分析
ELK:elasticsearch+logstash+kibana
logstash采集日志,ES进行复杂的数据分析,kibana展示。
7、BI系统
例如:大型商场集团,BI分析一下某某区域最近3年的用户消费金额的趋势以及用户群体的组成构成,产出相关的数张报表,**区,最近3年,每年消费金额呈现100%的增长,而且用户群体85%是高级白领,开一个新商场。ES执行数据分析和挖掘,Kibana进行数据可视化国内。
8、管理系统在“需要”的时候
例如:OA、CRM、APS、MES、ERP等
正常情况,内部管理系统,数据量不会十分巨大,但是也难免有场景下需要可以考虑原因ES
数据量在几万或者几十万时候,可以快速在结构化数据库中查出,但当数据量已到百万千万甚至亿级别时候,可通过ES搞定搜索时间慢灵活搜索等壁垒。
9、技术和设计的角度
a.搜索词全文的推进,比如传统上,支持搜“手机”,可能搜出结果均为华为手机、小米手机,ES可以搜出手机壳、手机组件、甚至手机辐射信息,前提是搜索库中存在的,否则按传统查询方式无疑工作量是相当巨大的
b.拆分搜索,比如想搜索的关键字记不清,可能只需输入“但 龙城”,结果可推荐诗词信息、李广等

四、ElasticSearch技术分解

4.1倒排索引
倒排索引也叫反向索引,有反向索引必有正向索引。通俗来讲,正向索引是通过key找value,反向索引则是通过value找key。倒排列表记录了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。
1、词条(Term)
 索引里面最小的存储和查询单元,对于英文来说是一个单词,对于中文来说一般指分词后的一个词。
2、词典(Term Dictionary)
或字典,是词条 Term 的集合。搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
3、倒排表(Post list)
一个文档通常由多个词组成,倒排表记录的是某个词在哪些文档里出现过以及出现的位置。每条记录称为一个倒排项(Posting)。倒排表记录的不单是文档编号,还存储了词频等信息。
4、倒排文件(Inverted File)
所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件被称之为倒排文件,倒排文件是存储倒排索引的物理文件。
4.2全文检索
当我们输入“大话游”,会被拆分成”大”,“话游”2个词,用2个词去倒排索引里面去检索数据,检索到的数据返回,整个过程就叫做全文检索。
如果用数据库的思维来做,假如一共1000W的记录,按照之前的思路就是扫描1000W次,每次扫描,都需要匹配那个文本所有的字符,确认是否包含搜索的关键词,而且还不能将搜索词拆解来进行检索 。
如果是利用倒排索引的话,假设还是1000W,拆分出来的词语,假设有1亿个词语,那么在倒排索引中,就有1亿行。我们可能不需要检索1亿次,有可能检索1次或者N+1,就能找到我们需要的数据,也有可能是100W次,也有可能是1000W次。
4.3集群(Cluster)
ES 的集群搭建很简单,不需要依赖第三方协调管理组件,自身内部就实现了集群的管理功能。
ES 集群由一个或多个 Elasticsearch 节点组成,每个节点配置相同的 cluster.name 即可加入集群,默认值为 “elasticsearch”。
确保不同的环境中使用不同的集群名称,否则最终会导致节点加入错误的集群。
一个 Elasticsearch 服务启动实例就是一个节点(Node)。节点通过 node.name 来设置节点名称,如果不设置则在启动时给节点分配一个随机通用唯一标识符作为名称。
由于ES集群模式与zookeeper不一样,单数双数节点都可以,所以会出现脑裂现象:
同时如果由于网络或其他原因导致集群中选举出多个 Master 节点,使得数据更新时出现不一致,这种现象称之为脑裂,即集群中不同的节点对于 Master 的选择出现了分歧,出现了多个 Master 竞争。
“脑裂”问题可能有以下几个原因造成:
网络问题: 集群间的网络延迟导致一些节点访问不到 Master,认为 Master 挂掉了从而选举出新的 Master,并对 Master 上的分片和副本标红,分配新的主分片。
节点负载: 主节点的角色既为 Master 又为 Data,访问量较大时可能会导致 ES 停止响应(假死状态)造成大面积延迟,此时其他节点得不到主节点的响应认为主节点挂掉了,会重新选取主节点。
内存回收: 主节点的角色既为 Master 又为 Data,当 Data 节点上的 ES 进程占用的内存较大,引发 JVM 的大规模内存回收,造成 ES 进程失去响应。
为了避免脑裂现象的发生,我们可以从原因着手通过以下几个方面来做出优化措施:
适当调大响应时间,减少误判。 通过参数 discovery.zen.ping_timeout 设置节点状态的响应时间,默认为 3s,可以适当调大。
如果 Master 在该响应时间的范围内没有做出响应应答,判断该节点已经挂掉了。调大参数(如 6s,discovery.zen.ping_timeout:6),可适当减少误判。
选举触发。 我们需要在候选集群中的节点的配置文件中设置参数 discovery.zen.munimum_master_nodes 的值。
这个参数表示在选举主节点时需要参与选举的候选主节点的节点数,默认值是 1,官方建议取值(master_eligibel_nodes2)+1,其中 master_eligibel_nodes 为候选主节点的个数。
这样做既能防止脑裂现象的发生,也能最大限度地提升集群的高可用性,因为只要不少于 discovery.zen.munimum_master_nodes 个候选节点存活,选举工作就能正常进行。
当小于这个值的。
4.4分片(Shards)
ES 支持 PB 级全文搜索,当索引上的数据量太大的时候,ES 通过水平拆分的方式将一个索引上的数据拆分出来分配到不同的数据块上,拆分出来的数据库块称之为一个分片。
这类似于 MySQL 的分库分表,只不过 MySQL 分库分表需要借助第三方组件而 ES 内部自身实现了此功能。
在一个多分片的索引中写入数据时,通过路由来确定具体写入哪一个分片中,所以在创建索引的时候需要指定分片的数量,并且分片的数量一旦确定就不能修改。
4.5副本(Replicas)
副本就是对分片的 Copy,每个主分片都有一个或多个副本分片,当主分片异常时,副本可以提供数据的查询等操作。
主分片和对应的副本分片是不会在同一个节点上的,所以副本分片数的最大值是 N-1(其中 N 为节点数)。
对文档的新建、索引和删除请求都是写操作,必须在主分片上面完成之后才能被复制到相关的副本分片。
分片带来的效果:
将数据分片是为了提高可处理数据的容量和易于进行水平扩展,为分片做副本是为了提高集群的稳定性和提高并发量。
副本是乘法,越多消耗越大,但也越保险。分片是除法,分片越多,单分片数据就越少也越分散。
副本越多,集群的可用性就越高,但是由于每个分片都相当于一个 Lucene 的索引文件,会占用一定的文件句柄、内存及 CPU。并且分片间的数据同步也会占用一定的网络带宽,所以索引的分片数和副本数也不是越多越好。
4.6映射(Mapping)
映射是用于定义 ES 对索引中字段的存储类型、分词方式和是否存储等信息,就像数据库中的 Schema ,描述了文档可能具有的字段或属性、每个字段的数据类型。
4.7ES版本
Elasticsearch (排除 0.x 和 1.x)目前有如下常用的稳定的主版本:2.x,5.x,6.x,7.x(current)。
ES没有 3.x 和 4.x,ES 从 2.4.6 直接跳到了 5.0.0。其实是为了 ELK(ElasticSearch,Logstash,Kibana)技术栈的版本统一,免的给用户带来混乱。
在 Elasticsearch 是 2.x (2.x 的最后一版 2.4.6 的发布时间是 July 25, 2017) 的情况下,Kibana 已经是 4.x(Kibana 4.6.5 的发布时间是 July 25, 2017)。
那么在 Kibana 的下一主版本肯定是 5.x 了,所以 Elasticsearch 直接将自己的主版本发布为 5.0.0 了。
统一之后,选版本就不会犹豫困惑了,选定 Elasticsearch 的版本后再选择相同版本的 Kibana 就行了,不用担忧版本不兼容的问题。
Elasticsearch 是使用 Java 构建,所以除了注意 ELK 技术的版本统一,我们在选择 Elasticsearch 的版本的时候还需要注意 JDK 的版本。
因为每个大版本所依赖的 JDK 版本也不同,目前 7.2 版本已经可以支持 JDK11。
4.8ES安装使用介绍
1下载和解压 Elasticsearch,无需安装解压后即可用,解压后目录如上图:
bin:二进制系统指令目录,包含启动命令和安装插件命令等。
config:配置文件目录。
data:数据存储目录。
lib:依赖包目录。
logs:日志文件目录。
modules:模块库,例如 x-pack 的模块。
plugins:插件目录。
2安装目录下运行 bin/elasticsearch 来启动 ES。
3默认在 9200 端口运行,请求 curl http://localhost:9200/ 或者浏览器输入 http://localhost:9200,得到一个 JSON 对象,其中包含当前节点、集群、版本等信息。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戰士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值