es
Es,搜索,就是通过一个关键字或者一段描述得到正确的结果
往常搜索都用数据库精确搜索,但是数据库模糊搜索,索引不起作用,事件复杂度是o(n),性能低
倒排索引:查询小米智能nfc手机,被分词成为小米、智能、nfc、手机
在现有数据中小米手机匹配2次,小米nfc手机匹配3次,小米耳机匹配1次,相关度最高的就是小米nfc手机,用空间换时间
es中的倒排索引存的是:
包含关键字的document list,比如包含了小米关键字的,数据行id,1、2、3、4
关键词在doc里出现的次数(tf,词频,越高代表越相关)
关键词在所有索引中出现的次数(idf,越高代表相关度越低)
关键词在当前doc出现的次数
每个doc的长度
包含这个关键词的所有doc的平均长度
lucene是单机版的,做集群宕机会丢失数据,需要自己创建索引
引入es
高可用,分布式,高性能,面向开发者友好没有复杂的api,es不是搜索引擎,es集群自动发现
自动维护数据在多个节点上的建立
帮助搜索请求的负载均衡
自动维护冗余副本,保证部分节点宕机时不会有任何数据丢失
es基于lucene提供了许多高级功能:符合查询,聚合分析,基于地理位置查询
可以处理pb级别的数据
核心概念
Cluster一个节点不代表一台机器,
Node一个集群至少有两个节点
field最小的存储单元,一个数据字段,与index和type一起可以定位一个doc,类似于row里的column
doc:就是数据单位,数据行,es最小的数据单元,json格式的,类似于table里的row
type:逻辑上的数据分类,一个索引会分为很多type,类似于db里的table
index:索引,理解为mysql的db,一类相同或者类似的doc,比如员工索引,商品索引,类别
shard分片:把数据分散在不同节点上,某台机器宕机,可以保证其他节点数据的完整性,副本.一个index包含多个shard,每个shard承载部分数据
Primary shard 和 replica shard 每个doc只存在某个primary shard以及与它对应的 replica shard中,不会存在于多个primary shard中,replica shard是primary shard的副本,提供容错以及读请求负载.doc可以存在多个replica shard中
primary shard在创建索引时就已经固定了,replica shard可以修改,p默认是5个,r默认是一个,代表10个shard,5个primary shard,5个与之对应的replica shard,
primary shard不能和自己的replica shard放在同一个节点上,防止节点宕机,起容错作用
每一个shard都是一个lucene,有完整的创建索引的处理请求能力
es会自动在nodes上做shard均衡
es容错
第一步:master选举,master节点毁坏后,es会从剩余的节点中选举一个master
第二步:宕机的节点中有p分片的话,会在剩余的节点中找一个replica分片升级为primary分片
第三步:尝试重启故障机
第四步:数据恢复,在old p分片重启的过程中,有一个r分片被升级成p分片进行了写入操作,old p分片重启完成后,new p分片会拷贝增量数据给old p分片
触发master选举
-
ping所有节点,查看是否有master,其他节点会返回是否有master
- 如果没有master则从候选节点选一个(配置了node.master:true的节点)
-
投票(算法),先根据优先级比较,再根据id最小比较
- 票数过半,当选并告诉其他节点
- 不过半则继续选举master
-
查看master是否是当前节点
- 不是,如果是其他节点当选了master,那么当前节点会请求加入集群
- 是,当选master
假如集群中有3个master-eligible node,分别为Node_A、 Node_B、 Node_C, 选举优先级也分别为Node_A、Node_B、Node_C。三个node都认为当前没有master,于是都各自发起选举,选举结果都为Node_A(因为选举时按照优先级排序,如上文所述),准master。于是Node_A开始等join(选票),Node_B、Node_C都向Node_A发送join,当Node_A接收到一次join时,加上它自己的一票,就获得了两票了(超过半数),于是Node_A成为Master。此时cluster_state(集群状态)中包含两个节点,当Node_A再收到另一个节点的join时,cluster_state包含全部三个节点。
node.master:true/false,是否是master候选节点,一般来说master不用于数据存储,因为数据节点会产生较大压力宕机
node.data:true/false,默认true
以上两个选项有4种情况
true:true,是候选节点,又存储数据.但是压力大可能会宕机,主资格节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点
true:false,标准的候选节点
false:true,标准的数据节点,会存储数据
false:false,协调节点,该节点只能处理路由请求,处理搜索,分发索引操作**等,从本质上来说该客户节点表现为智能负载平衡器,每一个节点都是一个隐式的协调节点
es节点建议
建议
- 对于Ingest节点,如果我们没有格式转换、类型转换等需求,直接设置为false。
- 3-5个节点属于轻量级集群,要保证主节点个数满足((节点数/2)+1)。
- 轻量级集群,节点的多重属性如:Master&Data设置为同一个节点可以理解的。
- 如果进一步优化,5节点可以将Master和Data再分离。
在一个生产集群中我们可以对这些节点的职责进行划分。
建议集群中设置3台以上的节点作为master节点【node.master: true node.data: false】
这些节点只负责成为主节点,维护整个集群的状态。
再根据数据量设置一批data节点【node.master: false node.data: true】
这些节点只负责存储数据,后期提供建立索引和查询索引的服务,这样的话如果用户请求比较频繁,这些节点的压力也会比较大
所以在集群中建议再设置一批client节点【node.master: false node.data: false】, 主要是针对海量请求的时候可以进行负载均衡。
这些节点只负责处理用户请求,实现请求转发,负载均衡等功能
es健康值检查
有主分片p的机器宕机了,es健康值变为red
有r分片不可用了,变为yellow
es查询原理
es字段类型
字符
text:用于被全文搜索,会被解析成倒排索引,ik分词器分析中文
keyword:只能被精确查找(exact value),用于过滤排序聚合
数字
int,short,long等
时间
date
keyword:只能被精确查找,用于过滤排序聚合
查找分,精确查找以及范围查找
date类型:需要完全匹配,精确查找
mapping
mapping,就是index的type的元数据,决定了数据类型,建立倒排索引的行为,还有进行搜素的行为。
声明一个变量为int类型的变量, 以后这个变量都只能存储int类型的数据。同样的, 一个number类型的mapping字段只能存储number类型的数据。
一个mapping由一个或多个analyzer组成, 一个analyzer又由一个或多个filter组成的。当ES索引文档的时候,它把字段中的内容传递给相应的analyzer,analyzer再传递给各自的filters
mapping不仅告诉ES一个field中是什么类型的值, 它还告诉ES如何索引数据以及数据是否能被搜索到。!!!当你的查询没有返回相应的数据, 你的mapping很有可能有问题
总结来说, mapping的作用就是执行一系列的指令将输入的数据转成可搜索的索引项。
定义string类型数据如何建立索引以及分词
index:是否对当前字段建立索引
analyzer:指定分析器
- analyzed 可以使用分词
- no analyzed 不使用分词器
- no 不使用分词词,也不能检索