ES全景知识点
2021-11-23 17:25:20 0 举报
AI智能生成
ES全景知识点汇总
作者其他创作
大纲/内容
ES 的介绍
什么是搜索
如果用数据库来做搜索会怎么样
什么是全文检索
什么是 Lucene
什么是 Elasticsearch
分布式
高性能
高可用
可伸缩
高性能
高可用
可伸缩
适用于什么系统
数据量大
es 的分布式本质,可以帮助我们快速扩容承载大量数据
数据结构灵活多变,数据结构之间关系复杂
如果使用传统数据库承载这些数据,或者进行复杂查询,传统数据库支持度不好
对数据的相关操作比较简单
ES 的功能
分布式
搜索
全文检索
结构化检索
数据分析
其他
部分匹配
自动完成
搜索纠错
搜索推荐
自动完成
搜索纠错
搜索推荐
对海量数据近实时处理
适用场景
维基百科、百度百科
全文检索,高亮,搜索推荐
新闻网站
用户行为日志,然后进行数据分析
Stacl Overflow
全文检索,搜索问题
github
搜索行代码
电商网站
特点
可以作为一个大型分布式集群
Eslasticsearch不是新技术,主要结合了全文检索(lucene),数据分析以及分布式技术
对用户来说开箱即用
针对于传统数据库的补充
Eslasticsearch不是新技术,主要结合了全文检索(lucene),数据分析以及分布式技术
对用户来说开箱即用
针对于传统数据库的补充
核心概念
NTR(近实时)
从写入数据到可以被搜索有一个小延迟(大概一秒)
Cluster 集群
由一个或者多个 node 节点组成
每个集群都有一个 cluster_name 作为标识
每个集群都有一个 cluster_name 作为标识
Node 节点
一个 ES 实例就是一个 node 节点
一台机器上可以有多个实例
一台机器上可以有多个实例
Document 文档
es 中最小的数据单元
核心元数据
_index
此文档属于哪个索引
尽量 fields 大量相同的放入到同一个索引中
尽量 fields 大量相同的放入到同一个索引中
_type
此文档属于哪个 type
索引中会有少部分 fiedld 差异的数据,可以放入不同的 type 中
索引中会有少部分 fiedld 差异的数据,可以放入不同的 type 中
_id
此索引的唯一标识,可以根据_index+_type+_id 定位一个 document
生成规则
自己生成-PUT 后面跟上自己生成的 id 号
系统生成-POST 系统会自动生成
系统生成-POST 系统会自动生成
_source
操作
Index 索引
一个 index 是一堆相似结构的文档数据
一个 index 包含多个 document 文档
一个 index 包含多个 document 文档
Type 类型
Shard 分片
一个 index 被拆分为多个 shard
每个 shard 会存放这个 index 部分数据
这些 shard 会被散落到多台服务器
shard 其实叫 primary shard,一般简称为 shard
每个 shard 会存放这个 index 部分数据
这些 shard 会被散落到多台服务器
shard 其实叫 primary shard,一般简称为 shard
replica 副本
其实叫 replica shard 一般简称为 replica
Es 概念和数据库概念对比
Es VS 数据库
Document VS 行
Type VS 表
Index VS 库
Document VS 行
Type VS 表
Index VS 库
集群相关
健康状态
green
每个索引的 primary shard 和 replica shard 都是 active 状态
yellow
每个索引的 primary shard 都是 active 状态 但是部分 replica shard 不是 active 状态
red
不是所有索引的 primary shard 都是 active 状态 部分索引有数据丢失
每个索引的 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
node.master:true
node.data:true
只能当 master 不能存储数据
node.master:true
node.data:false
node.master:true
node.data:false
不能当 master 只能存储数据
node.master:false
node.data:true
node.master:false
node.data:true
不能当 master 不能存储数据 当作路由
node.master:false
node.data:false
node.master:false
node.data:false
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 机制才会生效
大多数的计算规则:((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-范围查询
match-分词查询,全文检索,只要匹配一项就返回
match_phrase-要求每个分词都必须有
range-范围查询
组合查询
must
must_not
should
filter
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
通配符搜索
扫描整个倒排索引
搜索推荐
dis_max
best fields策略 某一个 field 匹配到了尽可能多的关键字被排在前面,而不是尽可能多的 field 匹配到了少数关键词,排在了前面
tie_breaker
除了取 best fields 的最高分以外,还考虑其他 query 的因素
跨多个 field 搜索
举例:地址可能分布式在省、市、区的字段中
使用 copy_to 语法,将多个字段合为一个字段
使用 multi_match中 type 类型为 cross_fields operater是 and
前缀搜索(不推荐使用)
通配符搜索
搜索推荐
正则搜索
ngram
什么是 ngram
举例hello
h
he
hel
hell
hello
he
hel
hell
hello
怎么使用
在建立索引的时候就需要指定字段是 ngram 分词
可以指定最多分多少
max_gram
h
he
hel
he
hel
在指定查询索引必须是 standard
"search_analyzer": "standard"
然后在查询的时候就可以直接使用了
fuzzy
纠错匹配
中文分词
配置文件
地址
自定义分词
聚合分析
文章相关
日均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 条评论
下一页