倒排索引:根据关键词,造索引
- 分词
- 把字段分词 如:小米手机 分成 小米、手机;
- 统计
统计分词在在哪里出现,标记出现的位置 - 相关度
当查询 如:小米智能手机- 进行分词,如:小米:智能:手机;分别在倒排索引表中出现的次数 次数越多 表示相关度越高,表示最想要的结果。
速度
单核 CPU 一般大于 100GB 内存 一般大概是20-50GB 磁盘 Raid 一般 SATA3 500MB SSD 最快 一般 2GB
倒排索引(查询索引文件不需要模糊查询)
数据结构
- 包含这个关键词的document list
- 关键词在每个doc中 出现的次数 TF term frequency 词频
- 关键词在索引中出现的次数 IDF inverse doc frequency
- 关键词在当前doc中出席那的次数
- 每个doc的长度,越长相关度越低
- 包含这个关键词的所有doc的平均长度
Lucene
jar包, 帮我们创建倒排索引,提供了复杂的API
如果用Lucene做集群实现搜索,会有哪些问题- 节点一旦宕机,数据丢失,后果不堪设想
- 自己维护,麻烦(自己创建管理索引),单台节点的承载请求的能力是有限的,需要人工负载(雨露均沾)。
ES: 分布式、高性能、高可用、可伸缩、已维护 ES 不等于 搜索引擎
- 分布式的搜索,存储和数据分析引擎
- 优点
- 面向开发者友好,屏蔽Lucene的复杂特性,集群自动发现
- 自动维护数据在过个节点上的建立。
- 会帮我做搜索请求的负载均衡
- 自动维护冗余副本,保证了部分节点宕机的情况下仍然不会有任何数据丢失
- ES基于Lucene提供很多高级功能:符合查询,聚合分析,基于地理位置
- 对于大公司,可以构建几百台服务器的大型分布式集群,处理PB级别数据,对于小公司,开箱即用,门槛低上手简单。
- 相遇传统数据库,提供了全文检索,同义词处理,
- 应用领域
- 全文检索、高亮、搜索推荐
- 各大网站的用户行为日志(点击、浏览、收藏、评论)
- (Business Intelligence 商业智能),数据分析:数据挖掘统计。
- GitHub:代码托管平台,几千亿代码
- ELK:(Elasticsearch(数据存储)、Logstash(日志采集)、Kibana(可视化)
ES核心概念
- Cluster(集群):每个集群至少包含两个节点。
- Node:集群中的各个节点,一个节点不代表一台服务器。
- Filed:一个数据字段,与index和type一起,可以定位一个doc.
- Document:ES最小的数据单元。
- ype:逻辑上的数据分类。
- Index:一类相同或者类似的doc,比如一个员工索引,商品索引。
share 分片 (P:Primary share;R:replica share)
- 一个index包含多个share,默认5P,默认每个P分配一个R,P的数量在创建所以韩的时候设置,如果想修改,需要重建索引。
- 每个share都是一个Lucene实例,有完整的创建索引的处理请求能力。
- ES会自动在nodes上为我们做shared均衡。
- 一个doc是不可能同时存在于多个shared中的,但是可以存在于多个shared中。
- P和对应的R不能同时存在于同一个节点中,所以最低的可用配置是两台节点,互为主备。
不同的数据(类型。结构)不要存放在同一个index中! 数据被用来做复杂的聚合分析(耗时、耗资源),会导致查询慢。
一台机器宕机,保证其他节点数据的完整性
横向扩展 share rebalance:数据量的提升,副本(节点):QPS的提升,高可用
ES容错
- 第一步:master选举
- 当master节点宕机的时候,ES会自动的在剩余的机器中选择一个作为master节点
- 如果是本节点当选master,票数过半后当选master,然后告诉别的节点没戏了,可以停下来,如果是别的节点当选,那么请求新的master节点加入集群。
- 脑裂: 可能会产生多个Master节点,配置:discovery.zen.minimum_master_nodes = N/2+1
- Replica容错
- R副本提升为 P副本
- 尝试重启故障机
- 数据恢复 ,
- 拷贝增量数据