ELK
何为 ELK,Elasticsearch + Logstach + Kibaba
- Elasticsearch:存储,计算,搜索数据
- Logstash:数据抓取
- Kibaba:数据可视化
倒排索引
要说倒排索引,首先要从正向索引谈起,比如 MySQL
MySQL 这类关系型数据库,如果搜索 ID,会直接走索引(索引设置得正确的前提下),一旦走了索引,查询起来是很快的,但是如果是模糊查询,就不一定了,需要逐行扫描,在索引设置得不好的情况下,需要全表扫描,数据量大的场景下效率非常低
倒排索引中有两个重要的概念:
- 文档(Document):ES 里保存的数据,其中的每一条数据就是一个文档,类似数据库的一条记录
- 词条(Term):对数据进行分词后得到的有意义的词语
倒排索引是对正向索引的一种特殊处理:
- 将文档数据利用分词算法,得到一堆的词条
- ES 里保存的每行数据包括词条,词条所在文档 ID 等信息
- 因为词条具有唯一性,可以给词条创建索引
搜索流程:
- 发起搜索请求
- 分词得到词条
- 根据词条拿到 ES 里的文档 ID(这个 ID 会和 MySQL 里的 ID 同步)
- 根据 ID (去 MySQL)拿到具体数据
虽然需要查两遍,先查倒排索引,再查正向索引,但因为都走了索引,所以非常快,无需全表扫描
两者的关系如下表
MySQL | Elasticsearch |
---|---|
table | index |
row | document |
column | field |
schema | mapping |
sql | dsl |
两者不能比较,关注的领域不同,MySQL 擅长事务类型操作,可以确保数据的安全和一致性,ES 则擅长海量数据的搜索,分析,计算,实际上往往两者结合使用
IK 分词器
- ik_smart:只能切分,粗粒度
- ik_max_word:最细切分,细粒度
ES 搜索高亮
- 给文档中的关键字加一个标签
- 页面给这个标签设置 高亮 CSS
ES 集群
不管什么集群,集群无非解决几个问题
- 海量数据存储
- 单点故障
ES 通过对数据进行分片,存储到不同的节点中,将备份放到对方节点,完成互相备份,当集群中的某个节点挂掉后,会立即将挂掉的节点上的分片数据迁移到其他节点,确保数据安全
集群监控
可以使用 Kibana 直接操作,或者 Cerebro