引言
上一篇主要讲解的是在windows环境下:Elasticsearch的单机、Elasticsearch的伪集群。
本篇主要讲解的是:传统数据库的索引、Elasticsearch的倒排索引、Elasticsearch与关系型数据库对比。
传统数据库的索引
索引简介
索引是数据库中,表级管理必须要配置的。如果不做索引,表级扫描是全表扫描,全表扫描可以看成逐行扫描,这样的话你查询数据对I/O占用太大了。所以咱们对经常访问的表,全做成rowid扫描访问,依靠的就是索引。
此处我拿Oracle数据库举例,因为oracle数据库适用OLTP和OLAP两种业务场景,使用范围太广了。对于索引的原理,其它数据库大同小异。索引是为提高查询效率而制定的机制,对于大数量数据的查询中,索引成功命中后,能够成倍提高查询效率,缩短查询时间。索引同时配合分区表,对于一张上亿的大表,查询语句如果同时命中索引和分区,查询结果会在几毫秒返回。
sql查询示意图
通过图片所示,只需要查询3次,即可命中你要的结果。如果没有索引,默认的查询方式是全表扫描,也就是说扫描表中的每1行记录,直到找到你需要的记录。
创建索引前的思考
(1)、SQL执行语句中,Where条件列要有索引的列,这样才可以命中索引
(2)、将索引与表放在不同的表空间中,避免争用,减少I/O
(3)、针对大的索引考虑NOLOGGING选项,加快创建索引的速度
(4)、创建大型索引过程中由于需要排序,要设置合适大小的PGA与临时表空间
(5)、创建大型索引时注意online参数的使用避免锁表以及数据,创建索引与DML相互进行锁定
(6)、在创建大型索引时编写脚本,使用nohup命令配合&执行,将脚本放入后台进程执行,避免窗口中断造成创建索引中断
结束
关于传统关系数据库中的索引内容,就扩展这么多了,下面接着步入正题吧。
Elasticsearch的倒排索引
1、把原文档进行分词,并找出单词所在文档编号
2、分词后的单词,在不同文档中出现的次数(TF)
3、分词后的单词,在不同文档中出的次数(TF)、位置(POS)
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、概念对应关系示意图
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插件。后续的内容更精彩,敬请期待,感谢兄弟们的关注!!!
标签:倒排,创建,数据库,单词,索引,文档,揉碎,Elasticsearch From: https://blog.51cto.com/51power/6365083