产生的背景

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

Elasticsearch是什么

Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎,可以近乎实时地快速存储搜索分析大量数据。
Elasticsearch 的本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。

作用

在日常开发中,数据库也能做到(实时、存储、搜索、分析)。相对于数据库,Elasticsearch 的强大之处就是可以模糊查询
在数据库中,我们需要模糊搜索某个数据时,一般使用 like '%data%' 进行模糊查询,但是这种查询方式是不走索引的,如果在数据量为上千万或上亿级时,查询的性能会迅速下降。如果我们想实现秒级的模糊查询,就得使用 Elasticsearch
Elasticsearch 最常见的场景就是我们的搜索引擎,每次我们在搜索引擎输入一些关键字的时候,就能帮我们找到近似的结果。

原理

Elasticsearch 使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
当 ElasticSearch 的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置)寻找集群中的其它节点,并与之建立连接。Elasticsearch 实现快速的“模糊匹配”/“相关性查询”,实际上是它会你你写入数据到 Elasticsearch 的时候会进行分词
在搜索引擎中输入一段文字,Elasticsearch 会通过分词器对查询的文字进行分词,这些分词汇总起来就是 Term Dictionary ,然后通过分词找到对应的记录,这些文档点 token 保存在 PostingList
如果 Term Dictionary 中的词由于是非常的多,所以会为其进行排序,等要查找的时候,就可以通过二分查询,不需要遍历整个 Term Dictionary

数据类型

Elasticsearch 的数据结构相对于 MySQL,给出如下的对应关系表会更好理解。
|MYSQL|ElasticSearch|
|-|-|
|Database|Index|
|Table|Type|
|Row|Document|
|Column|Field|
|Schema|Mapping|
|Index|Everything is indexed|
|SQL|Query DSL|
|SELECT * FROM table … |GET http://… |
|UPDATE table SET … |PUT http://… |