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