首页 > 其他分享 >Elasticsearch掰开揉碎第4篇倒排索引

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

时间:2023-05-28 14:32:24浏览次数:46  
标签:倒排 创建 数据库 单词 索引 文档 揉碎 Elasticsearch

引言

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

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

传统数据库的索引

索引简介

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

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

sql查询示意图

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

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

创建索引前的思考

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

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

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

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

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

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

结束

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

Elasticsearch的倒排索引

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

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

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

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

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

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

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

Elasticsearch掰开揉碎第4篇倒排索引_Elasticsearch_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篇倒排索引_sql_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插件。后续的内容更精彩,敬请期待,感谢兄弟们的关注!!!

标签:倒排,创建,数据库,单词,索引,文档,揉碎,Elasticsearch
From: https://blog.51cto.com/51power/6365083

相关文章

  • Elasticsearch掰开揉碎第10篇maven项目
    引言上一篇主要讲解Java基础环境搭建:jdk和maven的安装\配置、eclipse和jdk\maven集成、idea和jdk\maven集成本篇主要讲解的是:使用eclipse创建普通java项目\maven项目,使用idea创建普通java项目\maven项目。普通java项目简介1、什么是javaJava可以编写桌面应用程序、Web应用程序、分......
  • Elasticsearch掰开揉碎第11篇java操作ES前期准备
    引言上一篇主要讲解的是:使用eclipse创建普通java项目\maven项目,使用idea创建普通java项目\maven项目。本篇主要讲解的是:使用java操作Elasticsearch的前期准备(创建索引库、设置mapping、插入数据、验证数据、创建maven项目)前期准备之数据1、创建索引库curl-XPUT'http://192.168......
  • elasticsearch-7.12.1集群设置账号密码(亲测可用)
    ES7.7以后的版本将安全认证功能免费开放了。并将X-pack插件集成了到了开源的ElasticSearch版本中。1.在集群的“主节点”上生成证书切换到elastsearch的目录下,使用下列命令生成证书bin/elasticsearch-certutilcert-outconfig/elastic-certificates.p12-pass""2.将生成......
  • Elasticsearch8.4.3安装最新ik分词器elasticsearch-analysis-ik【v8.4.3版本】
     Elasticsearch8.4.3安装最新ik分词器elasticsearch-analysis-ik【v8.4.3版本】https://blog.csdn.net/u014282578/article/details/127815352......
  • ElasticSearch启动&停止命令
    ElasticSearch启动&停止命令1、查进程ps-ef|grepelastic2、杀进程kill-91302ps-ef|grepelastic3、启动服务#切换es用户,启动elasticsearch不能使用root用户suescd/opt/elasticsearch-7.10.2/bin#后台运行./elasticsearch-dps-ef|grepelastic ......
  • docker 安装elasticsearch7.9 和 SkyWalkin
    1、相关地址:官网:https://skywalking.apache.org/下载:https://skywalking.apache.org/downloads/Github:https://github.com/apache/skywalking文档:https://skywalking.apache.org/docs/main/v9.1.0/readme/ 其他版本文档,先进https://skywalking.apache.org/docs/main/,选择版本,查......
  • Elasticsearch 之 join 关联查询及使用场景
    在Elasticsearch这样的分布式系统中执行类似SQL的join连接是代价是比较大的,然而,Elasticsearch却给我们提供了基于水平扩展的两种连接形式。这句话摘自Elasticsearch官网,从“然而”来看,说明某些场景某些情况下我们还是可以使用的一、join总述1、关系类比在关系型数据库中,以MySQ......
  • Elasticsearch之join关联查询及使用场景 | 京东云技术团队
    在Elasticsearch这样的分布式系统中执行类似SQL的join连接是代价是比较大的,然而,Elasticsearch却给我们提供了基于水平扩展的两种连接形式。这句话摘自Elasticsearch官网,从“然而”来看,说明某些场景某些情况下我们还是可以使用的一、join总述1、关系类比在关系型数据库中,以MySQL为......
  • elasticsearch在启动后出现[transport.netty][solr001] exception caught on transpor
    elasticsearch在启动后出现如下错误:[2019-04-18T09:29:57,850][WARN][o.e.t.n.Netty4Transport ][xHaZmSP]exceptioncaughtontransportlayer[[id:0xe6246f88,L:/127.0.0.1:9300-R:/127.0.0.1:9493]],closingconnectionjava.io.IOException:杩滅▼涓绘満寮鸿揩鍏......
  • 【ElasticSearch】关于es跨域的问题
    本文目录一、使用es的head插件二、其他说明一、使用es的head插件在使用es的head插件时,默认的9100,需要访问es的默认端口9200时,会出现跨域问题,此时只需要修改一下es的配置文件即可。在elasticsearch.yml中添加开启跨域的配置:http.cors.enabled:truehttp.cors.allow-origin:"*"说明......