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