作者:幻好 恒生LIGHT云社区

Elasticsearch产生的背景

人工智能、大数据快速发展的今天,对于 TB 甚至 PB 级大数据的快速检索已然成为刚需。随着数据量级别的快速增大,在系统中对于数据的处理就会出现很多问题,比如:数据达到上百亿时,如果能对数据进行快速检索,找到我们想要的数据?

初识搜索引擎 Elasticsearch_elasticsearch

为了解决上述问题,我们最先想到的是关系型数据库的集群方式存储数据,通过中间件的方式将查询语句发送到对于的集群库中;或者通过非关系数据库将数据存到各个节点,然后检索各个节点,最后返回需要的数据;亦或将我们常用数据存入内存中,查询时直接通过内存查得。

但以上这些我们通常的方式,好像并不能完全解决日益增长的数据量处理的问题,基于这种问题背景下,就引出了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_大数据_02

Elasticsearch的作用和原理

作用

在日常开发中,数据库也能做到(实时、存储、搜索、分析)。相对于数据库,Elasticsearch 的强大之处就是可以模糊查询

在数据库中,我们需要模糊搜索某个数据时,一般使用 like '%data%' 进行模糊查询,但是这种查询方式是不走索引的,如果在数据量为上千万或上亿级时,查询的性能会迅速下降。如果我们想实现秒级的模糊查询,就得使用 Elasticsearch

Elasticsearch 最常见的场景就是我们的搜索引擎,每次我们在搜索引擎输入一些关键字的时候,就能帮我们找到近似的结果。

初识搜索引擎 Elasticsearch_搜索_03

原理

Elasticsearch 使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。

当 ElasticSearch 的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置)寻找集群中的其它节点,并与之建立连接。

初识搜索引擎 Elasticsearch_搜索_04

Elasticsearch 实现快速的“模糊匹配”/“相关性查询”,实际上是它会你你写入数据到 Elasticsearch 的时候会进行分词

初识搜索引擎 Elasticsearch_搜索_05

在搜索引擎中输入一段文字,Elasticsearch 会通过分词器对查询的文字进行分词,这些分词汇总起来就是 Term Dictionary ,然后通过分词找到对应的记录,这些文档点 token 保存在 PostingList

如果 Term Dictionary 中的词由于是非常的多,所以会为其进行排序,等要查找的时候,就可以通过二分查询,不需要遍历整个 Term Dictionary

如果 Term Dictionary的词继续增加,不可能把 Term Dictionary 所有的词都放在内存中,于是 Elasticsearch 还设计了一层叫做 Term Index,这层只存储部分词的前缀Term Index 会存在内存中,从而保证了检索的速度。

Elasticsearch的数据类型

Elasticsearch 的数据结构相对于 MySQL,给出如下的对应关系表会更好理解。

初识搜索引擎 Elasticsearch_大数据_06

  1. MySQL 中的数据库(DataBase),等价于 ES 中的索引(Index)。

  2. MySQL 中一个数据库下面有 N 张表(Table),等价于1个索引 Index 下面有 N 多类型(Type)。

  3. MySQL 中一个数据库表(Table)下的数据由多行(Row)多列(column,属性)组成,等价于1个 Type 由多个文档(Document)和多 Field 组成。

  4. MySQL 中定义表结构、设定字段类型等价于 ES 中的 Mapping。举例说明,在一个关系型数据库里面,Schema 定义了表、每个表的字段,还有表和字段之间的关系。与之对应的,在 ES 中,Mapping 定义索引下的 Type 的字段处理规则,即索引如何建立、索引类型、是否保存原始索引 JSON 文档、是否压缩原始 JSON 文档、是否需要分词处理、如何进行分词处理等。

  5. MySQL 中的增 insert、删 delete、改 update、查 search 操作等价于 ES 中的增 PUT/POST、删 Delete、改 _update、查 GET。其中的修改指定条件的更新 update 等价于 ES 中的 update_by_query,指定条件的删除等价于 ES 中的 delete_by_query。

  6. MySQL 中的 group by、avg、sum 等函数类似于 ES 中的 Aggregations 的部分特性。

  7. MySQL 中的去重 distinct 类似 ES 中的 cardinality 操作。

  8. MySQL 中的数据迁移等价于 ES 中的 reindex 操作。

最后

本文只是简单的介绍一下ES的一些基础知识,后续文章会继续分享ES的压缩算法,集群,分片,副本复制等,以及相关技术的实践应用。

觉得文章对你有帮助可以点赞评论一起交流哦。下一篇:渐入佳境,ElasticSearch 深入理解与实践