做者:幻好 恒生LIGHT云社区html
Elasticsearch产生的背景
人工智能、大数据快速发展的今天,对于 TB 甚至 PB 级大数据的快速检索已然成为刚需。随着数据量级别的快速增大,在系统中对于数据的处理就会出现不少问题,好比:数据达到上百亿时,若是能对数据进行快速检索,找到咱们想要的数据?算法
为了解决上述问题,咱们最早想到的是关系型数据库的集群方式存储数据,经过中间件的方式将查询语句发送到对于的集群库中;或者经过非关系数据库将数据存到各个节点,而后检索各个节点,最后返回须要的数据;亦或将咱们经常使用数据存入内存中,查询时直接经过内存查得。数据库
但以上这些咱们一般的方式,好像并不能彻底解决日益增加的数据量处理的问题,基于这种问题背景下,就引出了Elasticsearch。服务器
Elasticsearch是什么
Elasticsearch is a highly scalable open-source full-text search and analytics engine.It allows you to store, search, and analyze big volumes of data quickly and in near real time.(参考)数据结构
Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎,能够近乎实时地快速存储、搜索和分析大量数据。app
Elasticsearch 的几个重要的特色:高度可扩展、实时、存储、搜索、分析。elasticsearch
Elasticsearch 的自己扩展性很好,能够扩展到上百台服务器,处理PB级别的数据。ide
Elasticsearch的做用和原理
做用
在平常开发中,数据库也能作到(实时、存储、搜索、分析)。相对于数据库,Elasticsearch 的强大之处就是能够模糊查询。函数
在数据库中,咱们须要模糊搜索某个数据时,通常使用 like '%data%'
进行模糊查询,可是这种查询方式是不走索引的,若是在数据量为上千万或上亿级时,查询的性能会迅速降低。若是咱们想实现秒级的模糊查询,就得使用 Elasticsearch 。性能
Elasticsearch 最多见的场景就是咱们的搜索引擎,每次咱们在搜索引擎输入一些关键字的时候,就能帮咱们找到近似的结果。
原理
Elasticsearch 使用Lucene做为其核心来实现全部索引和搜索的功能,可是它的目的是经过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
当 ElasticSearch 的节点启动后,它会利用多播(multicast)(或者单播,若是用户更改了配置)寻找集群中的其它节点,并与之创建链接。
Elasticsearch 实现快速的“模糊匹配”/“相关性查询”,其实是它会你你写入数据到 Elasticsearch 的时候会进行分词。
在搜索引擎中输入一段文字,Elasticsearch 会经过分词器对查询的文字进行分词,这些分词汇总起来就是 Term Dictionary
,而后经过分词找到对应的记录,这些文档点 token
保存在 PostingList
。
若是 Term Dictionary
中的词因为是很是的多,因此会为其进行排序,等要查找的时候,就能够经过二分查询,不须要遍历整个 Term Dictionary
。
若是 Term Dictionary
的词继续增长,不可能把 Term Dictionary
全部的词都放在内存中,因而 Elasticsearch 还设计了一层叫作 Term Index
,这层只存储部分词的前缀,Term Index
会存在内存中,从而保证了检索的速度。
Elasticsearch的数据类型
Elasticsearch 的数据结构相对于 MySQL,给出以下的对应关系表会更好理解。
- MySQL 中的数据库(DataBase),等价于 ES 中的索引(Index)。
- MySQL 中一个数据库下面有 N 张表(Table),等价于1个索引 Index 下面有 N 多类型(Type)。
- MySQL 中一个数据库表(Table)下的数据由多行(Row)多列(column,属性)组成,等价于1个 Type 由多个文档(Document)和多 Field 组成。
- MySQL 中定义表结构、设定字段类型等价于 ES 中的 Mapping。举例说明,在一个关系型数据库里面,Schema 定义了表、每一个表的字段,还有表和字段之间的关系。与之对应的,在 ES 中,Mapping 定义索引下的 Type 的字段处理规则,即索引如何创建、索引类型、是否保存原始索引 JSON 文档、是否压缩原始 JSON 文档、是否须要分词处理、如何进行分词处理等。
- MySQL 中的增 insert、删 delete、改 update、查 search 操做等价于 ES 中的增 PUT/POST、删 Delete、改 _update、查 GET。其中的修改指定条件的更新 update 等价于 ES 中的 update_by_query,指定条件的删除等价于 ES 中的 delete_by_query。
- MySQL 中的 group by、avg、sum 等函数相似于 ES 中的 Aggregations 的部分特性。
- MySQL 中的去重 distinct 相似 ES 中的 cardinality 操做。
- MySQL 中的数据迁移等价于 ES 中的 reindex 操做。
最后
本文只是简单的介绍一下ES的一些基础知识,后续文章会继续分享ES的压缩算法,集群,分片,副本复制等,以及相关技术的实践应用。
以为文章对你有帮助能够点赞评论一块儿交流哦,欢迎call我。