首先来看百度百科的定义
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
整理思路,查询关键字

我们来看看Lucene是什么
Lucene是一个用Java写的全文检索引擎工具包,实现构造了索引和搜索两大核心功能,并且两者相互独立,这使得开发人员可以方便扩展,Lucene提供了丰富的API , 可以与存储在索引中的信息方便的交互。需要说明的是它并不是一个完整的全文检索应用, 而是为应用程序提供索引和搜索功能。即若想让Lucene 真正起作用, 还需在其基础上做一些必要的二次开发。
那么它跟关系数据库有啥区别呢,为啥要用他呢
比较项 | Lucene检索 | 关系数据库检索 |
---|---|---|
数据检索 | 从Lucene的索引文件中检出 | 由数据库索引检索记录 |
索引结构 | Document(文档) | Record(记录) |
查询结果 | Hit:满足关系的文档组成 | 查询结果集:包含关键字的记录组成 |
全文检索 | 支持 | 不支持 |
模糊查询 | 支持 | 不支持 |
结果排序 | 设置权重,进行相关性排序 | 不能排序 |
概念还是不够清晰,那么我们来查找一下Elasticsearch的使用场景,来加深对它的理解
- 将Elasticsearch作为网站的主要后端系统——正如我们所讨论,你可能拥有一个网站,允许人们书写博客帖,但是你希望有搜索帖子的功能。可以使用Elasticsearch存储所有和帖子相关的数据,并处理查询请求。
- 将Elasticsearch添加到现有系统——你阅读此书可能是因为已经有一套处理数据的系统,而你想加入搜索功能。我们将浏览几个整体设计,看看这一点是如何实现的。
- 将Elasticsearch作为现有解决方案中的后端部分——因为Elasticsearch是开源的系统,并且提供了直接的HTTP接口,现有一个大型的生态系统在支持它。例如,Elasticsearch在日志集中处理中应用广泛。考虑到现有工具可以写入和读取Elasticsearch,你可以不需要进行任何开发,而是配置这些工具让其按照你所想的去运作。
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
我们分析问题的思路大概分为三步:
- 是什么?
- 为什么?
- 怎么做?
是什么?上面的百度百科定义已经为我们解释了Elasticsearch是什么。
为什么?通过对比mysql这样的关系数据库以及应用场景,我们大体可以知道为为什么会出现Elasticsearch。
怎么做?接下来我们来讨论Elasticsearch是怎么来实现数据的检索的
既然Elasticsearch是基于Lucene的,我们可以看一下Lucene的架构

全文检索技术由来已久,绝大多数都基于倒排索引来做,曾经也有过一些其他方案如文件指纹。倒排索引,顾名思义,它相反于一篇文章包含了哪些词,它从词出发,记载了这个词在哪些文档中出现过,由两部分组成——词典和倒排表。

