es

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节点建议

建议

  1. 对于Ingest节点,如果我们没有格式转换、类型转换等需求,直接设置为false。
  2. 3-5个节点属于轻量级集群,要保证主节点个数满足((节点数/2)+1)。
  3. 轻量级集群,节点的多重属性如:Master&Data设置为同一个节点可以理解的。
  4. 如果进一步优化,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:指定分析器

  1. analyzed 可以使用分词
  2. no analyzed 不使用分词器
  3. no 不使用分词词,也不能检索

analyzer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值