搜索功能
使用传统关系型数据库做搜索存在:性能差(模糊查询可能会索引失效)、不可靠、结果不准确(相关度低)等问题,为解决这类问题,可以使用ES来处理搜索请求。ES的核心是倒排索引
倒排索引 数据结构
- 包含这个关键词的document list
- 关键词在每个doc中出现的次数(词频) TF(term frequency)
- 关键词在整个索引中出现的次数 IDF (inverse doc frequency)
- 关键词在当前doc中出现的次数
- 每个doc的长度,越长相关度越低
- 包含这个关键词的所有doc的平均长度
Lucene
Lucene是一个jar包,帮我们创建倒排索引,提供复杂的API。Lucene是单点的,扩展相对复杂。
Elasticsearch
- 基于Lucene开发的分布式的搜索,存储和数据分析引擎
- 优点:
1. 面向开发者友好,屏蔽了Lucene的复杂性,集群自动发现
2. 自动维护数据在多个节点上的建立
3. 请求负载均衡
4. 自动维护冗余副本,部分节点宕机数据不会丢失
5. 提供高级功能,符合查询,聚合分析,基于地理位置等
6. 开箱即用,也可构建大型分布式集群,处理PB级数据
7. 提供全文检索,同义词处理,相关度排名,海量数据近实时处理 - 应用领域
1. 百度(全文检索,高亮,搜索推荐)
2.用户行为日志(用户点击、浏览、收藏、评论)
3. BI (business intelligence)商业智能,数据挖掘统计
4. ELK (Elasticsearch 数据存储 + Logstash 日志采集 + Kibana 可视化)
ES核心概念
- Cluster(集群):每个集群至少包含两个节点
- Node(节点):集群中的每个节点,一个节点不代表一台服务器
- Field(字段): 一个数据字段,与index和type一起,可以定位一个doc
- Document (文档):ES最小的数据单元 是json格式
- Type:逻辑上的数据分类,es 7.x中删除了type的概念
- Index:一类相同或者类似的doc,比如一个员工索引,商品索引
Shard分片:
- 一个index包含多个Shard,默认5个Primay,默认每个Primay分配一个Replica,Primay的数量在创建索引的时候设置,如果想修改,需要重建索引。
- 每个Shard都是一个Lucene实例,有完整的创建索引的处理请求能力。
- ES会自动在nodes上为我们做shard 均衡。
- 一个doc是不可能同时存在于多个PShard中的,但是可以存在于多个RShard中。
- Primay和对应的Replica不能同时存在于同一个节点,所以最低的可用配置是两个节点,互为主备。
网友评论