ElasticSearch 的知识梳理
Chapter 1:ElasticSearch的基本介绍
1.1.什么是elasticsearch?
- elasticSearch 是一款基于Java语言开发的,主要是用于进行全文检索的一款搜索引擎,底层是lucene
- elasticSearch 分布式的集群架构, 可以用于存储海量的数据, 可以在海量数据前进行搜索处理工作;
1.2.elasticsearch可以做什么?
- 信息检索
- 企业内部系统搜索
- l 关系型数据库使用like进行模糊检索,会导致索引失效,效率低下
- l 可以基于Elasticsearch来进行检索,效率杠杠的
- 数据分析引擎
- Elasticsearch 聚合可以对数十亿行日志数据进行聚合分析,探索数据的趋势和规律。
1.2.什么叫全文检索?
1.2.1. 结构化数据与非结构化数据
- l 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等
- l 非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等磁盘上的文件
1.2.2. 搜索结构化数据和非结构化数据
- l 使用SQL语言专门搜索结构化的数据
- l 使用ES/Lucene/solr建立倒排索引,根据关键字就可以搜索一些非结构化(文本)的数据
1.2.2.1.倒排索引
-
倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”
1.2.3. 全文检索
- 通过一个程序扫描文本中的每一个单词,针对单词建立索引,并保存该单词在文本中的位置、以及出现的次数
- 用户查询时,通过之前建立好的索引来查询,将索引中单词对应的文本位置、出现的次数返回给用户,因为有了具体文本的位置,所以就可以将具体内容读取出来了
1.3.ES 和 solr的区别
- Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
- Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;
1.3.1. json
-
json在java中 本质上讲就是一个有一定格式的字符串
-
相关格式:
第一类格式: {key1:value1,key2:value2 ..... } 第二类格式: [value1,value2,value3 .....] 以上两类, 可以进行嵌套使用: 例如: {key1:value1,key2:[v1,v2,v3...],key3:values3} [{key1:value1,key2:value2},{key1:value1,key2:value2},{key1:value1,key2:value2}....] 思考: 看到什么样数据格式, 能够想出其转换成 json的样子 例如1: List<String> 转换后的json: [v1,v2,v3...] Map<String,String> : 转换后的json: {k1:v1,k2:v2...} pojo类: person类 里面有三个成员变量 name age address 转换后的json: {name:'',age:'',address:''} List<Person> : 转换后的json: [{name:'',age:'',address:''},{name:'',age:'',address:''}...] 例如2:List<Map<String,List<String>>> 转换后的json: [{'':['','','']},{'':['','','']}] 记忆: 对于List set 类型 一般使用 [] 括号 对于 map pojo类型, 一般都是 {} 如何才能将对应数据类型, 转换为Json呢? 在市场上提供了非常多的转换工具 fastjson:阿里提供的一款转换工具 Gson: 谷歌公司提供转换工具 JackJson: 是Java中spring框架采用....
1.4. elasticsearch中的核心概念
-
index:索引库在一个ES中可以构建多个索引库的, 理解为MySQL中数据库,或者 hbase中命名空间; type:类型在一个索引库下可以构建多个类型,相当于在MySQL中一个数据库下面可以构建多个表,或者在 命名空间下构建多个表 ES在最新 6.x版本后, 已经不允许在一个索引库下有多个不同类型, 只允许有一个了 filed: 字段在索引库中,可以有多个字段,同时每个字段拥有数据类型的,类似于表中有多个字段,每个 字段有自己的类型 document:文档描述的是索引库中一行数据, 一个文档就表示一行数据, 类型与表中row mapping:映射用于设置索引库中字段的数据类型,比如说,字段采用什么类型,字段是否需要分词,是否需 要索引是否需要保存(原始数据).... setting: 设置用于对索引库设置,比如设置索引库有多少个分片多少个副本.... cluster: 集群表示ES的集群 node: 节点ES的各个节点 shards: 分片一个索引库可以被分为多个分片 默认为 5 replicas: 副本一个分片可以被分为多个副本 默认为 2 注意: 分片的数量不受节点的限制 副本的数据最多和节点的数量是一致的: 副本数量 <=节点的数量 副本一般为 :2 或者 3
1.5. elasticsearch的分布式集群架构
-
elasticsearch设计的理念就是分布式搜索引擎,底层其实还是基于lucene的。核心思想就是在多台机器上启动多个es进程实例,组成了一个es集群。es中存储数据的基本单位是索引;
-
首先建立一个索引,这个索引可以拆分成多个shard,每个shard存储部分数据。接着就是这个shard的数据实际是有多个备份,就是说每个shard都有一个primary shard,负责写入数据,但是还有几个replica shard。primary shard写入数据之后,会将数据同步到其他几个replica shard上去。 通过这个replica的方案,每个shard的数据都有多个备份,如果某个机器宕机了,没关系啊,还有别的数据副本在别的机器上,这样就实现高可用了。 es集群多个节点,会自动选举一个节点为master节点,这个master节点其实就是干一些管理的工的,比如维护索引元数据,负责切换primary shard和replica shard身份之类的。要是master节点宕机了,那么会重新选举一个节点为master节点。如果是非master节点宕机了,那么会由master节点,让那个宕机节点上的primary shard的身份转移到其他机器上的replica shard。接着你要是修复了那个宕机机器,重启了之后,master节点会控制将缺失的replica shard分配过去,同步后续修改的数据之类的,让集群恢复正常。 其实上述就是elasticsearch作为一个分布式搜索引擎最基本的一个架构设计;