初识搜索引擎 Elasticsearch

做者:幻好 恒生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

illustration-solution-enterprise-search-rock-solid-555.png

Elasticsearch的做用和原理

做用

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

在数据库中,咱们须要模糊搜索某个数据时,通常使用 like '%data%' 进行模糊查询,可是这种查询方式是不走索引的,若是在数据量为上千万或上亿级时,查询的性能会迅速降低。若是咱们想实现秒级的模糊查询,就得使用 Elasticsearch性能

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

image-20210604150001373.png

原理

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

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

3e7f4c840221802537f16118d77ff221.png

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

image-20210604153454643.png

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

若是 Term Dictionary 中的词因为是很是的多,因此会为其进行排序,等要查找的时候,就能够经过二分查询,不须要遍历整个 Term Dictionary

若是 Term Dictionary的词继续增长,不可能把 Term Dictionary 全部的词都放在内存中,因而 Elasticsearch 还设计了一层叫作 Term Index,这层只存储部分词的前缀Term Index 会存在内存中,从而保证了检索的速度。

Elasticsearch的数据类型

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

image-20210604153517626.png

  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的压缩算法,集群,分片,副本复制等,以及相关技术的实践应用。

以为文章对你有帮助能够点赞评论一块儿交流哦,欢迎call我。