作者:幻好 恒生LIGHT云社区
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 是一个高度可扩展的开源全文搜索和分析引擎,可以近乎实时地快速存储、搜索和分析大量数据。
Elasticsearch 的几个重要的特点:高度可扩展、实时、存储、搜索、分析。
Elasticsearch 的本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
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我。