作者:罗海鹏,叩丁狼教育高级讲师。原创文章,转载请注明出处。
前言
我们建立一个网站或者一个应用通常都会有搜索的功能,如果我们做的只是用户量很少的内网项目,并且搜索的字段都是一些内容很简短的字段,比如名字,编号之类的,那完全可以用数据库like语句
但是,数据库like查询性能非常低,如果搜索的请求多,或者需要搜索的是大文本类型的内容(全文搜索),那么这种搜索的方案是不可取的。
那既然我们要做性能高的全文搜索,这个需求又不能依赖数据库,只能有我们自己来实现了,但是令我们很受打击的是全文搜索是很难实现的,我们不仅希望能全文搜索,还希望它足够稳定足够快,希望我们的搜索结果有关键字高亮,并且能按各种匹配分数来排序,希望它能切换不同的分词算法来满足各种分词需求。所以说,我们想要做一个功能完善,性能强大的全文搜索真的不是那么简单,而全文搜索又是一个常见的需求,所以市面上已经有一些现成的解决方案了。
这些现成的解决方案开源出来,获得大量的社区开发者支持,不断为其开发插件,使其不断优化和完善,这就成了我们所说的搜索引擎了。
这些搜索引擎正是我们需要的,它可以解决我们遇到的痛点,我们可以直接拿这些开源的搜索引擎来使用,无需关心它如何实现,我们只需要专注我们业务的开发就行了,这样的话也避免了我们出现重复造轮子的现象了,而且这还是一个很麻烦的轮子。
在这些开源的搜索引擎中有一个特别优秀,市场占有量最大,他就是Lucene。但是随着分布式应用,微服务应用,云计算,大数据这些技术的兴起,像搜索这样的非常消耗系统性能的服务也应该把它抽取出来独立部署为一个服务系统,甚至是一个大型的云服务。然后根据访问的压力,可以横向扩展做搜索服务的集群,集群中的每个节点的数据都能以一个接近实时的速度来同步数据,并把请求按多种不同的算法来分发到具体的服务节点。而服务化了的搜索引擎能支持RESTful方式请求,并且交互的数据以json这种轻量数据格式。如果我们想让我们的全文搜索具备以上所提到的这些能力,那只使用Lucene是显然不够的,我们还得围绕着Lucene做大量的事情,这样的工作量和工作难度可能大多数中小型企业难以承受。但是,往往世界上就有那么一群人,他们很有能力,并且富有分享精神,他们以Lucene为核心构建了一套强大的搜索服务器,当然这些搜索服务器不但具备着搜索引擎本该有的一整套搜索相关的功能,还具备着我们上面所说的这些能力,最重要的是:它们是开源共享的。而它们中最有名气的就是elasticsearch和solr。其中,elasticsearch就是我们要深入探讨的技术。
Elasticsearch是什么
Elasticsearch是一个基于Lucene搜索引擎为核心构建的开源,分布式,RESTful搜索服务器。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便,轻松扩展服务节点。
Elasticsearch是用Java开发的,但它却不是只支持Java语言,因为它支持RESTful方式调用,那理论上它是支持所有开发语言的,除此之外,如果你不想使用RESTful方式调用Elasticsearch服务器,那Elasticsearch还提供了各种语言的api供我们使用。
我们通过以下这张分析图来看看elasticsearch是如何工作的:
相关概念
接近实时(NRT):
Elasticsearch 是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个很小的延迟,包括如果做了集群的话,集群中的各个节点数据同步也是接近实时的。
集群(cluster):
elasticsearch一个很大的优势是它可以很方便的做集群,在一个elasticsearch的集群中,有很多的节点(node),其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
节点(node):
节点(node)其实就是一个elasticsearch服务器的实例,节点(node)主要有3种类型,第一种类型是client_node,主要是起到请求分发的作用,类似路由。第二种类型是master_node,是主的节点,所有的新增,删除,数据分片都是由主节点操作(elasticsearch底层是没有更新数据操作的,上层对外提供的更新实际上是删除了再新增),当然也能承担搜索操作。第三种类型是date_node,该类型的节点只能做搜索操作,具体会分配到哪个date_node,就是由client_node决定,而data_node的数据都是从master_node同步过来的。
索引(index):
ElasticSearch将它的数据存储在一个或多个索引(index)中。用SQL领域的术语来类比,索引就像数据库,可以向索引写入文档或者从索引中读取文档。
文档类型(type):
文档类型(type)是用来规定文档的各个字段内容的数据类型和其他的一些约束,相当于关系型数据库中的表,一个索引(index)可以有多个文档类型(type)。
文档(document):
在Elasticsearch中,文档(document)是存储数据的载体,包含一个或多个字段。一个文档(document)相当于关系型数据库中的一行数据。
这些就是elasticsearch的一些比较重要的概念,还有其他的概念我们就不一一列举了,但是大家通过以上的概念可能发现,elasticsearch的设计跟关系型数据库的设计还是挺像的,我们可以通过关系型数据库的概念来类比着学习elasticsearch,所以来看看以下这张对比图:
那么关于Elasticsearch的介绍就先讲到这里,下个章节我们就来把Elasticsearch安装起来使用。