当前位置:网站首页 > 技术博客 > 正文

倒排索引算法



ElasticSearch基础:从倒排索引说起,快速认知ES

ElasticSearch(简称ES)是什么?按照 的定义,Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎。

很官方,但也很晦涩。所以,接下来我们尝试比较直白地去描述它。

首先,需要弄明白下面几个问题:

提到搜索,人们会立刻联想到在百度、谷歌上输入关键词获取相关的内容的场景。但搜索不等于百度,大部分APP支持的站内搜索更加大行其道。

数据库是储存和查询数据的利器,那么数据库是否适合做搜索呢?答案是不合适。第一个原因是,当数据库存储了大量数据后,查询效率大幅降低。

另外有些搜索场景,数据库也是不支持的,例如在下表中,我们试图通过“中国足球”这个关键词搜索数据,数据库是无法查询到相应内容的。

什么是倒排索引?倒排索引也叫反向索引,我们通常理解的索引是通过key寻找value,与之相反,倒排索引是通过value寻找key,故而被称作反向索引。

下面我们用一个简单的例子描述一下倒排索引的作用过程:

假如现在有三份数据文档,内容分别是:

为了创建索引,ES引擎通过分词器将每个文档的内容拆成单独的词(称之为词条,或term),再将这些词条创建成不含重复词条的排序列表,然后列出每个词条出现在哪个文档,结果如下:

这种结构由文档中所有不重复的词的列表构成,对于其中每个词都有至少一个文档与与之关联。这种由属性值来确定记录的位置的结构就是倒排索引,带有倒排索引的文件被称为倒排文件。

将上表转为更直观的图片来展示倒排索引:

其中,几个核心术语需要着重理解:

词典和倒排表是 Lucene这种很重要的两种数据结构,是实现快速检索的重要基石。词典和倒排文件是分两部分存储的,词典在内存中而倒排文件存储在磁盘。

至于Lucene,直白地说,它就是一个jar包,封装好了各种建立倒排索引、匹配索引进行搜索的各种算法。我们可以引入Lucene,基于它的API进行开发。

ElasticSearch就在Lucene的基础上实现的,对Lucene进行了良好的封装,简化开发,并提供了很多高级功能。

ElasticSearch生态

ElasticSearch 为快速检索和分析大数据而生,目前已形成丰富的生态。

例如目前比较流行的ELK体系:

要了解 Elasticsearch ,首先要先了解下面的几个专有名词:索引(Index)、类型(Type)、文档(Document)、映射(mapping)

既然 Elasticsearch 能够存储和查询数据,那么我们自然要将其和最具知名度的数据库-Mysql进行一番对比,两者之间可以通过下表做一个并不非常严谨的类比,主要是为了方便理解。

ES和Mysql直观对比:

Elasticsearch 设计上是天然支持分布式的,下面我们了解一下集群相关概念。

在实际生产中,ES通常与Mysql等存储系统联合使用,例如下面这个设计:

Springboot集成ES非常方便,只要三步操作:

1、pom.xml添加依赖:

2、application.yml增加配置:

3、新建config类:

写个测试方法测试一下:

下载地址:

安装:

1、将压缩包上传到linux服务器到特定目录,比如 /export/test

2、解压压缩包:

ES目录介绍:

首先,我们需要做一些系统配置,要使用有权限的用户,例如root用户。

1、配置用户

因为用户不能直接运行ES,所以新增一个用户(如果有非root用户,直接用也可以)

2、设置最大句柄数(nofile)和最大进程数(nproc):

在末尾追加内容(已有的话忽略):

3、调整vm.max_map_count的大小

max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量

在文尾追加(已有的话则忽略此步):

执行以下命令使该配置生效:

接下来,切换到刚刚创建的用户,修改ES配置文件:

主要修改以下几项:

启动es服务:

访问 http://192.168.1.13:9200/,出现以下信息,表示es启动成功。

设置后台启动:

下载地址:

Kibana是Java应用,解压即可。解压后,进入文件目录的config目录中,编辑文件,修改该项:

然后,进入bin目录,双击kibana.bat 即可启动。

以上是ElasticSearch基础的内容,后续将持续添加更多内容,敬请关注!

版权声明


相关文章:

  • es6常用特性2025-04-25 08:01:05
  • .suffixes makefile2025-04-25 08:01:05
  • 服务器硬件的主要特征2025-04-25 08:01:05
  • linux etc/inittab2025-04-25 08:01:05
  • 循环队列c语言代码2025-04-25 08:01:05
  • redis数据备份如何实现2025-04-25 08:01:05
  • 二维码图片解码器2025-04-25 08:01:05
  • pycharm汉化教程2025-04-25 08:01:05
  • lxml怎么使用2025-04-25 08:01:05
  • csrf攻击防范2025-04-25 08:01:05