ES最全知识点
2021-11-18 17:27:25 3 举报
AI智能生成
ES最全知识点
作者其他创作
大纲/内容
ES 的介绍
什么是搜索
如果用数据库来做搜索会怎么样
什么是全文检索
什么是 Lucene
什么是 Elasticsearch
分布式
高性能
高可用
可伸缩
适用于什么系统
数据量大
es 的分布式本质,可以帮助我们快速扩容承载大量数据
数据结构灵活多变,数据结构之间关系复杂
如果使用传统数据库承载这些数据,或者进行复杂查询,传统数据库支持度不好
对数据的相关操作比较简单
ES 的功能
分布式
搜索
全文检索
结构化检索
数据分析
其他
部分匹配
自动完成
搜索纠错
搜索推荐
对海量数据近实时处理
适用场景
维基百科、百度百科
全文检索,高亮,搜索推荐
新闻网站
用户行为日志,然后进行数据分析
Stacl Overflow
全文检索,搜索问题
Github
搜索行代码
电商网站
检索商品
日志数据分析
logstash 采集,ES 进行复杂的数据分析
商品价格的监控网站
用户设定某商品的价格阈值
BI 系统
ES 执行数据分析和发掘,Kinbana 进行数据可视化
特点
可以作为一个大型分布式集群
Eslasticsearch不是新技术,主要结合了全文检索(lucene),数据分析以及分布式技术
对用户来说开箱即用
针对于传统数据库的补充
核心概念
NTR(近实时)
从写入数据到可以被搜索有一个小延迟(大概一秒)
Cluster 集群
由一个或者多个 node 节点组成
每个集群都有一个 cluster_name 作为标识
Node 节点
一个 ES 实例就是一个 node 节点
一台机器上可以有多个实例
Document 文档
es 中最小的数据单元
核心元数据
_index
此文档属于哪个索引
尽量 fields 大量相同的放入到同一个索引中
_type
此文档属于哪个 type
索引中会有少部分 fiedld 差异的数据,可以放入不同的 type 中
_id
此索引的唯一标识,可以根据_index+_type+_id 定位一个 document
生成规则
自己生成
PUT 后面跟上自己生成的 id 号
系统生成
POST 系统会自动生成
_source
操作
增 PUT
创建和修改可以是一样的语法
更新的话是全量替换
更新的话会将旧 document 标记为 delete,然后建立新的 document
删除 DELETE
并不是直接物理删除
改 POST
如何保证并发下修改的一致性
利用乐观锁实现
可以利用 es 自己提供的版本号进行控制
可以利用自己生成的版本号进行控制
可以局部更新某个 document 的field
更新流程
内部获取 dcoument
将传过来的 field 更新到 document 的 json 中
将老的 document 标记为 deleted
将修改后的新的 docyment 创建出来
查 GET
Index 索引
一个 index 是一堆相似结构的文档数据
一个 index 包含多个 document 文档
Type 类型
Shard 分片
一个 index 被拆分为多个 shard
每个 shard 会存放这个 index 部分数据
这些 shard 会被散落到多台服务器
shard 其实叫 primary shard,一般简称为 shard
replica 副本
其实叫 replica shard 一般简称为 replica
Es 概念和数据库概念对比
Es VS 数据库
Document VS 行
Type VS 表
Index VS 库
集群相关
健康状态
green
每个索引的 primary shard 和 replica shard 都是 active 状态
yellow
每个索引的 primary shard 都是 active 状态 但是部分 replica shard 不是 active 状态
red
不是所有索引的 primary shard 都是 active 状态 部分索引有数据丢失
节点平等的分布式架构
节点对等,每个节点都能接收所有的请求
自动请求路由
响应收集
横向扩容
自动负载均衡
Node 角色
Master Node
由候选节点选出,负责管理 ES 集群
管理索引的相关操作
管理分片的相关操作
Data Node
存储数据,负责数据的增删改查
Ingest Node
提取节点,和logstash 的功能类似
四种组合
既能当 master 又能存储数据
node.master:true
node.data:true
只能当 master 不能存储数据
node.master:true
node.data:false
不能当 master 只能存储数据
node.master:false
node.data:true
不能当 master 不能存储数据 当作路由
node.master:false
node.data:false
document 的路由算法
增删改查一个 document 的时候,都会带来一个routing num 默认是 document 的 id 值
也可以自己指定 routing value
会将这个roungting 值进行 has 运算
然后根据 hash 出来的值对集群中的 primary shard的数量进行求余运算,计算出是哪一个 shard
如果是增删改 那么就会找到其 primary shard
如果是查询请求 那么会根据随即轮询算法找到其 primary shard 和其 replica shard
可能 document 还在建立索引过程中,此时 replica shard 可能还没有数据
所以此时如果路由到了 replica shard 那么就会返回找不到document 数据
如何保证写一致性
增删改的操作中可以带一个 consistency 的参数(5.x 版本已经废弃掉)
one
只要有一个 primar shard 是可用的就可以写成功
all
要求所有的 primar shard 是活跃的。才可以执行写操作
quorum(默认参数)
要求所有的 shard 中,必须是所有的 shard 是可用的才可以写成功
大多数的计算规则:((primary shard + num_of_replicas)/2)+1
当 num_of+replicas>1 quorum 机制才会生效
六种搜索方式
query string search
query DSL
query filter
full-text search
phrase search
slot
关键词如果匹配上需要的步数
highlight search
搜索语法
term filter/query
对搜索不分词,直接去倒排索引中匹配,输入什么就匹配什么
相当于 mysql 中的单个 where 条件
boost
对搜索条件设置权重
搜索层级关系
term、match、range
term
不分词查询
match
分词查询,全文检索,只要匹配一项就返回
match_phrase
要求每个分词都必须有
range
范围查询
组合查询
must
must_not
should
filter
dis_max
best fields策略 某一个 field 匹配到了尽可能多的关键字被排在前面,而不是尽可能多的 field 匹配到了少数关键词,排在了前面
tie_breaker
除了取 best fields 的最高分以外,还考虑其他 query 的因素
跨多个 field 搜索
举例
地址可能分布式在省、市、区的字段中
使用 copy_to 语法,将多个字段合为一个字段
使用 multi_match中 type 类型为 cross_fields operater是 and
前缀搜索(不推荐使用)
性能差
prefix
通配符搜索
扫描整个倒排索引
搜索推荐
百度框中打一个字,下面会有一些推荐搜索关键字相关的
match_phrase_prefix
原理跟 match_phrase 类似,唯一区别就是把最后一个 term 作为前缀去搜索
可以用 max_expansions
指定 prefix 最多匹配多少term
正则搜索
ngram
什么是 ngram
举例hello
h
he
hel
hell
hello
怎么使用
在建立索引的时候就需要指定字段是 ngram 分词
可以指定最多分多少
max_gram
h
he
hel
在指定查询索引必须是 standard
"search_analyzer": "standard"
然后在查询的时候就可以直接使用了
fuzzy
纠错匹配
中文分词
配置文件
地址
es/plugins/ik/config
IKAnalyzer.cfg.xml
配置自定义词库
main.dic
ik原生内置的中文词库
quantifier.dic
单位相关的词
suffix.dic
放了些后缀
surname.dic
中国的姓氏
stopword.dic
英文停用词
自定义分词
聚合分析
文章相关
日均5亿查询量的京东到家订单中心,为什么舍MySQL用ES?
ElasticSearch集群故障案例分析: 警惕通配符查询
有赞搜索系统的技术内幕
实际应用
避免深分页
Mapping
mapping的过程
在 es 中插入数据 ,es 会自动建立索引,同时建立 type 以及对应的 mapping
mapping 中就自动定义了每个 field 的数据类型
不同的数据类型(比如 text 和 data),可能有的是 exact value 和 full text
exact value 分词时将整个值作为一个关键词建立倒排索引
full text 会经历各种各样的处理
分词
normaliztion
时态转换
同义词转换
大小写转换
不同的数据类型在进行搜索的时候也会按照建立倒排索引的规则一样,去进行处理关键词,然后进行搜索
可以用 es 的 dynamic mapping 让其自动建立 mapping,自动设置数据类型
true or false -> boolean
123 -> long
123.45 - > double
2017-01-01 -> date
"hello world" -> string
查看 mapping
GET /index/_mapping/type
也可以提前手动创建 index 和 tyoe 的 mapping,自己对各个 field 进行设置
mapping 的注意点
只能新增一个 field 的 mapping,对于已有field 的 mapping 不能修改
filter 和 query 对比
filter
只是按照搜索条件过滤出需要的数据,不计算相关度分数,对相关度没有影响
filter 性能高,不需要计算相关度分数,并且内置自动的 cache 最常使用的 filter 的数据
query
会去计算每个 document 相对于搜索条件的相关度,并按相关度进行排序
query 性能差,要计算相关度分数,按照分数进行排序,而且无法返回 cache 结果
使用场景
需要将最匹配搜索条件的数据先返回,那么用 query
如果只是根据一些条件筛选出一部分数据,不关注其排序,那么使用 filter
为什么 filter 效率高
利用了 bitset 与 caching 的机制
如何定位不合法的搜索以及其原因
在搜索的后面加上 explain 参数
explain 参数也可以查看其计算匹配的算法
如何定制排序规则
在参数中加上 sort 参数即可
索引
倒排索引
为了搜索
正排索引
为了排序
利用 scroll 滚动搜索
每次 scroll 搜索都会返回一个 scroll ID
然后下次搜索带上这个 scroll ID 就能搜索下一批的数据
分词器
利用es 的索引别名机制可以使应用不停机的切换索引
倒排索引不可变
好处
不需要锁,提升并发能力
数据不变,一直保存在 os cache 中
filter cache 一直驻留在内存,因为数据不变
可以压缩,节省 cpu 和 io 的开销
坏处
每次都需要重新构建整个索引
document 的写入流程
发生一个document 的写入和修改操作时
内存 buffer 缓冲
每隔一定时间都会刷新一次 buffer 到 index segment 中
index segment
os cache
os disk
大数据量的 es 数据如何提升查询效率
file system cache
尽量让数据都在 file system cache 中
es 中只放搜索的数据字段,其他字段从 hbase 中查询
数据预热
冷热分离
搞两个索引
一个索引放冷数据,一个索引放热数据
document 的数据模型设计
避免复杂的关联查询,复杂的查询语法
分页性能优化
0 条评论
下一页