1.学习方法:看官方文档,更新速度快,不要在书上花太多时间
2.倒排索引:基于document,分词,把词拆开,统计,出现频次,相关度越高,说明结果越精准
分词以后,统计各分词在document出现的id,这就是倒排索引,然后根据搜索关键词,把关键词分词,再去匹配分词,匹配到之后将各分词内的id集合,去统计原词汇出现的相关度
3.倒排索引数据结构:
包含关键词的document list(id);
关键词在每个doc中出现的次数,TF term frequency;
关键词在整个索引出现的次数,IDF inverse doc frequency;idf越高,相关度越低(说明在每个doc中都出现了,相关度不高,搜索精准度不高) ;
关键词在当前doc中出现的次数;
每个doc的长度,越长相关度越低;
包含整个关键词的所有doc的平均长度;
4.lucene:java的jar包,
功能:
创建倒排索引;
提供了复杂api;
缺点:
单点;(如果lucene做集群节点一旦宕机,数据丢失;如果做集群,需要zk去管理,管理成本高,单台节点的承载能力有限,需要人工做负载,所以要用es,因为es本身就是分布式的)
5.es集群:面向开发者友好,只需要通过客户端调用,不需要自己在每个节点创建索引,并且自动做负载和冗余副本
pb级别的数据;
分布式的搜索,存储,数据分析引擎;
优点:
面向开发者友好,屏蔽了Lucene的复杂性,集群自动发现;
自动维护数据在多个节点上的建立;
会帮我们处理搜索请求的负载均衡;
自动维护冗余副本,保证部分节点宕机的情况下仍然不会有任何数据丢失;
es基于lucene提供了很多的高级功能,复合查询,聚合分析,基于地理位置(例如疫情地图);
对于大公司,可以构建几百台服务器的大型分布式集群,处理PB级别的数据;
对于小公司,开箱即用,门槛低,上手简单;
相比传统数据库,提供了全文检索,同义词处理(美丽的,漂亮的),相关度排名,聚合分析以及海量数据的近实时(NTR)处理;
应用领域:
百度(全文检索,高亮,搜索推荐);
各大网站的用户行为日志(用户点击,浏览,收藏,评论);
BI(商业智能,数据分析,数据挖掘统计),用户画像等;
github几千亿行代码,代码托管平台;
ELK(elasticsearch (数据存储),logstash(日志采集),kinaba(可视化));
6.es核心概念
集群:
每个集群至少包含两个节点;
集群中的每个节点,一个节点不代表一台服务器,一台服务器可以有多个节点;
Field:一个数据字段,与index和type一起,可以定位一个doc;
Document:可以理解为行,es的最小数据单元,一个json对象
Type:逻辑上的数据分类,
Index:一类相同或者类似的doc,比如一个员工索引,商品索引;
shard 分片:如果一台机器宕机,可以保证其他节点数据的完整性,横向扩展,es会自动做shard rebalance
primary shard ,replica shard副本分片(性能提升很高),高可用,横向扩容;
一个Index包含多个shard,默认5个primary shard,默认每个primary shard分配一个replica shard,primary shard的数量在创建索引的时候设置,如果想修改,需要重新创建索引;
每个shard 都是一个lucene实例,有完整的创建索引的处理请求能力;
es会自动在Nodes上为我们做shard均衡;
一个doc是不可能同时存在于多个primary shard中的,但是可以存在多个replica shard中;
副本分片主要是查询压力的,不做写请求;
p和对应的r不能同时存在于同一个节点,所以最低的可用配置是两台节点,互为主备;