Elasticsearch全文检索入门这一篇就够了

2020-05-22 00:00:00 索引 查询 数据 文档 类型

本文仅针对搜索与Elasticsearch小白,先介绍了全文搜索的原理,然后介绍了Elasticsearch中的一些基本概念,接着讲解如何在Elasticsearch中插入文档构建查询索引,后介绍Elasticsearch的线上查询API的使用方式。

全文搜索原理

顺序扫描

如何实现全文搜索?简单的方法就是用正则去匹配文档中的字符串。这种方式看似粗暴,但却不乏使用场景,比如Linux中的grep命令,Windows中用Ctrl+F在文件中进行查找等。

这种方式的缺点就是效率低,需要扫描全部文件,有时候搜索一个磁盘可能检索大半个小时。但Mac的spotlight搜索却是非常快,这是如何实现的了?

倒排索引

大家都知道,在数据库中直接全表查询的时间复杂度是o(n),如果对索引列进行查询,其时间复杂度为o(logn),如果数据以key-value形式存储,查询时间复杂度将降为o(1)。那么在全文搜索中我们直接建立从查询词到文档的映射是不是也就获得了o(1)的查询性能?这种词汇到文档的映射被称之为倒排索引。那么倒排索引是如何构建的呢?一般流程如下:

加入你有3篇文档

经过切词后得到每篇文档的词袋表示,即每篇文档所包含的词

然后再构建从词汇到文档ID的映射

当然实际在切词后还会做一些去停用词、词目还原等操作,以提升索引质量。

下面将介绍如何用Elasticsearch完成上面倒排索引的构建过程,然后在倒排索引上进行各种查询。

基本概念

索引、类型与文档

索引:含相同属性的文档集合。相当于关系型数据库中的一个database

类型:索引可以定义一个或者多个类型,文档必须属于一个类型,其相当于关系型数据库中的表,是通过mapping定义的。mapping中主要包括字段名、字段数据类型和字段索引类型这3个方面的定义,相当于关系型数据库中的schema。

文档:可以被索引的基本数据单位,也是全文搜索中被搜索的对象,可以对应一个网页,一篇txt文档或者一个商品。 相当于关系型数据库中的表中的一行记录。

举个例子,假设现在有大量的数据,有网页,有图片,有视频,有学术论文等,现在你打算基于这些数据用ES打造一个搜索引擎。由于这些数据高度异构,你可能对网页、图片、视频、论文等分别构建不同的”索引“。以Bing搜索为例,其上方的不同选项卡,对应着不同的索引。

在学术论文索引中,为了支持作者查询,机构查询,发表时间查询等多种查询模式,你需要定义多种”类型“,在定义”类型“时,你需要通过mapping文件定义各个字段的类型,处理方式(如切词、过滤等),然后所有文档将基于这个mapping文件来构建倒排索引。可以说一个”类型”对应一个倒排索引表。

具体的一篇论文即为一篇”文档“。

分片 备份

分片

有时候一个索引的数据量非常大,甚至超出了单机的存储能力,这个时候需要对索引分片存储,分别存到不同机器上。

备份

为了防止节点故障到时索引分片丢失,一般会对分片进行备份。备份除了可以保障数据安全性,还可以分担搜索的压力。

ES创建索引默认5个分片,1个备份,分片只能在创建索引的时候指定而备份可以后期动态修改。

安装部署

去官网下载Elasticsearch安装包,并解压到指定目录。

然后进入安装目录,启动命令:

./bin/elasticseatch

相关文章