Elasticsearch掰开揉碎第4篇倒排索引
  Lb78AVwchy8f 2023年11月02日 54 0

引言

上一篇主要讲解的是在windows环境下:Elasticsearch的单机、Elasticsearch的伪集群。

本篇主要讲解的是:传统数据库的索引、Elasticsearch的倒排索引、Elasticsearch与关系型数据库对比。

传统数据库的索引

索引简介

索引是数据库中,表级管理必须要配置的。如果不做索引,表级扫描是全表扫描,全表扫描可以看成逐行扫描,这样的话你查询数据对I/O占用太大了。所以咱们对经常访问的表,全做成rowid扫描访问,依靠的就是索引。 

此处我拿Oracle数据库举例,因为oracle数据库适用OLTP和OLAP两种业务场景,使用范围太广了。对于索引的原理,其它数据库大同小异。索引是为提高查询效率而制定的机制,对于大数量数据的查询中,索引成功命中后,能够成倍提高查询效率,缩短查询时间。索引同时配合分区表,对于一张上亿的大表,查询语句如果同时命中索引和分区,查询结果会在几毫秒返回。

sql查询示意图

Elasticsearch掰开揉碎第4篇倒排索引_Elasticsearch

通过图片所示,只需要查询3次,即可命中你要的结果。如果没有索引,默认的查询方式是全表扫描,也就是说扫描表中的每1行记录,直到找到你需要的记录。

创建索引前的思考

(1)、SQL执行语句中,Where条件列要有索引的列,这样才可以命中索引

(2)、将索引与表放在不同的表空间中,避免争用,减少I/O

(3)、针对大的索引考虑NOLOGGING选项,加快创建索引的速度

(4)、创建大型索引过程中由于需要排序,要设置合适大小的PGA与临时表空间

(5)、创建大型索引时注意online参数的使用避免锁表以及数据,创建索引与DML相互进行锁定

(6)、在创建大型索引时编写脚本,使用nohup命令配合&执行,将脚本放入后台进程执行,避免窗口中断造成创建索引中断

结束

关于传统关系数据库中的索引内容,就扩展这么多了,下面接着步入正题吧。

Elasticsearch的倒排索引

1、把原文档进行分词,并找出单词所在文档编号

Elasticsearch掰开揉碎第4篇倒排索引_分词_02

Elasticsearch掰开揉碎第4篇倒排索引_分词_03

2、分词后的单词,在不同文档中出现的次数(TF)

Elasticsearch掰开揉碎第4篇倒排索引_sql_04

Elasticsearch掰开揉碎第4篇倒排索引_Elasticsearch_05

3、分词后的单词,在不同文档中出的次数(TF)、位置(POS)

Elasticsearch掰开揉碎第4篇倒排索引_java_06

4、名词解释

单词ID:记录每个单词的单词编号

单词:对应的单词

文档频率:代表文档集合中有多少个文档包含某个单词

倒排列表:包含单词ID及其它必要的信息

DOicID:单词出现的文档id

TF:单词在某个文档中出现的次数

POS:单词在文档中出现的位置

5、综合说明

以单词"大飞哥"为例,其单词编号为6,文档频率为2,代表整个文档集合中有2个文档包含这个单词。

对应的倒排列表为{(3,1,<3>),(4,1,<3>)},含义是在文档3、文档4中出现过这个单词,在每个文档中出现过1次。单词"大飞哥"在文档3的POS是3,即文档的第3个单词是"大飞哥"。在文档4的POS是3,即文档的第3个单词是"大飞哥"。

这个倒排索引已经是一个非常完备的索引系统,实际搜索系统的索引结构基本如此。

ES与关系型数据库对比

1、概念对比

ES中的概念:Index(索引)、Type(类型)、Mapping(索引定义)、Document(文档)、Field(字段)、DSL(查询等语句)。

关系型数据库对应的概念:Table(表)、Schema(结构、定义)、 Row(数据行)、Column(数据列)、SQL(查询等语句)。

123

2、概念对应关系示意图

Elasticsearch掰开揉碎第4篇倒排索引_分词_07

3、实战说明

通过实战案例,对比说明两者的重要概念,兄弟们可以直观的理解这些概念。

a、在传统关系型数据库中创建一张class表,创建过程如下:

指定当前要操作的数据库

创建课程信息class表

编辑class表字段,如:课程编号id(char 类型)、课程名name(char 类型)

class表的每一行记录,就表示一门课程信息,不同列表示这门课程不同的属性

b、使用ES创建class索引如,创建过程如下:

配置启动一个ES实例(一个ES实例就相当于一个数据库)

创建课程信息索引(class)

不需要配置字段属性,ES会自动识别

一个json字符串表示一门课程信息,json字符串中包含课程属性的字段Field

c、创建Table和Index对比

(a)、关系型数据表使用 SQL 语句来创建数据表和数据,但需要提前定义好表结构和数据类型。

创建数据表

CREATE TABLE class(

   id varchar(20),

   name varchar(20)

);

创建一条数据

INSERT INTO class (id,name) VALUES ('1','oracle');

(b)、ES是基于http协议的,创建数据时,需要使用ES的Rest API,将json格式的学生信息数据利用Rest API进行PUT操作给ES接口创建数据

POST class/_create/1

{

 "id":"1",

 "name":"oracle"

}

结束语

至此,Elasticsearch掰开揉碎系列的第4篇就结束了,本篇文章中主要要讲解的是:传统数据库的索引、Elasticsearch的倒排索引、Elasticsearch与关系型数据库对比。

下一篇我带来的是:给Elasticsearch集群安装head插件。后续的内容更精彩,敬请期待,感谢兄弟们的关注!!!

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  3I1N9ysrcSyk   2023年12月08日   31   0   0 javahapi数据交换
  X5zJxoD00Cah   2023年12月11日   30   0   0 表名SQL
  DF5J4hb0hcmT   2023年12月07日   50   0   0 javaArthas
  DF5J4hb0hcmT   2023年12月08日   27   0   0 慢查询druidSQL
Lb78AVwchy8f