ElasticSearch简介

news2024/11/26 5:32:32

文章目录

  • ElasticSearch简介
  • 正向索引和倒排索引
    • 正向索引
    • 倒排索引
  • ElasticSearch和MySQL的区别

ElasticSearch简介

  • 什么是ElasticSearch
    ElasticSearch 是一款非常强大的开源搜索引擎,可以帮助我们从海量的数据中快速找到需要的内容。

  • 什么是ELK?
    ElasticSearch 结合 Kibana、Logstash、Beats,被成为 Elastic Stack(ELK,Elastic 技术栈)。ELK 被广泛应用在 日志数据分析、实时监控等领域。

其中,ElasticSearch 是 Elastic Stack 的核心,主要负责存储、搜索和分析数据。

在这里插入图片描述
ElasticSearch 的底层是 Lucene。而 Lucene 是Apache的开源搜索引擎类库,提供了搜索引擎的核心API,由 DougCutting 于 1999年研发。

Lucene的优点:

  1. 易扩展
  2. 高性能(基于倒排索引)

Lucene的缺点:

  1. 只限于Java语言开发
  2. 学习曲线陡峭
  3. 不支持水平扩展

而 ElasticSearch 相比 Lucene,具有下列优势:

  1. 支持分布式,可水平扩展
  2. 提供 Restful 接口,可被任何语言调用。

正向索引和倒排索引

倒排索引 的概念是基于MySQL这样的 正向索引 而言的。

为了更好的说明什么是正向索引,什么是倒排索引,下面我们直接举一个实例。

假设现在我们有以下的数据表:
在这里插入图片描述
他的主键id,即通过 id 查询我们是走索引的,其他的 title 等字段我们并未为其创建索引。

正向索引

现在,使用 Mysql 进行搜索,如果是根据id查询,那么直接走索引,查询速度非常快。但是如果我们使用的是 title 进行查询,那么 Mysql 将会逐行扫描数据,在数据量足够大的情况下,搜索的速度会变得非常非常慢。

流程大致如下:
1)用户搜索数据,条件是title符合"%手机%"
2)逐行获取数据,比如id为1的数据
3)判断数据中的title是否符合用户搜索条件
4)如果符合则放入结果集,不符合则丢弃。回到步骤1
在这里插入图片描述

倒排索引

倒排索引中有两个非常重要的概念:

  • 文档(Document):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息
  • 词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条

创建倒排索引是对正向索引的一种特殊处理,流程如下:

  • 将每一个文档的数据利用算法分词,得到一个个词条
  • 创建表,每行数据包括词条、词条所在文档id、位置等信息
  • 因为词条唯一性,可以给词条创建索引,例如hash表结构索引

举个简单的例子,以我们上面的表为例,建立倒排索引后,将会多出这么一个表格:
在这里插入图片描述
这个表格是怎么来的呢?他存的又是什么鬼东西呢?首先吧,这个表格的词条就是我们从刚才的 title 里面抽取,或者说分离出来的词。而文档 id 对应的就是该词条对应的能被用来索引的键(id)。

倒排索引的搜索流程如下(以搜索"华为手机"为例):
1)用户输入条件"华为手机"进行搜索。
2)对用户输入内容分词,得到词条:华为手机
3)拿着词条在倒排索引中查找,可以得到包含词条的文档id:1、2、3。
4)拿着文档id到正向索引中查找具体文档。
在这里插入图片描述
虽然要先查询倒排索引,再通过索引去查询数据表,但是无论是词条、还是文档id都建立了索引,查询速度非常快!无需全表扫描。

ElasticSearch和MySQL的区别

elasticsearch是面向 文档(Document) 存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为 json格式 后存储在 elasticsearch 中:

下图左边对应的是MySQL的存储右边对应的是ElasticSearch的存储
在这里插入图片描述
可以看到,我们的 Json文档 就相当于MySQL中的行,或者专业点,我们叫一条记录
而每个Json文档中包含很多的字段,类似于数据库中的

在MySQL中,我们会有很多张表(例如,用户表,学生表,成绩表),每张表存储的是数据,我称之为记录。而在ElasticSearch中,我们会有很多个索引(用户索引,学生索引,成绩索引),每个索引存储的数据,我们称之为文档

数据库的表会有约束信息,用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有映射(mapping),是索引中文档的字段约束信息,类似表的结构约束。

针对MySQL和ElasticSearch的概念做一下对比的话,大致如下:

MySQLElasticsearch说明
TableIndex索引(index),就是文档的集合,类似数据库的表(table)
RowDocument文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式
ColumnField字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)
SchemaMappingMapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)
SQLDSLDSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD

注意:ElasticSearch 和 MySQL 是互补关系,不是替代关系。

  • Mysql:擅长事务类型操作,可以确保数据的安全和一致性

  • Elasticsearch:擅长海量数据的搜索、分析、计算

因此在企业中,往往是两者结合使用

  • 对安全性要求较高的写操作,使用mysql实现
  • 对查询性能要求较高的搜索需求,使用elasticsearch实现
  • 两者再基于某种方式,实现数据的同步,保证一致性

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/345690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C/C++排序算法(三)—— 冒泡排序和快速排序

文章目录前言1. 冒泡排序🍑 基本思想🍑 图解冒泡🍑 动图演示🍑 代码实现🍑 代码优化🍑 特性总结2. 快速排序🍑 hoare 版本🍅 图解过程🍅 动图演示🍅 代码实现…

K_A12_005 基于STM32等单片机采集红外寻迹避障模块串口与OLED0.96双显示

K_A12_005 基于STM32等单片机采集红外寻迹避障模块串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明模块工作原理:对应程序:四、部分代码说明1、接线引脚定义1.1、STC89C52RC红外寻迹避障模块1.2、STM32F103C8T6红外寻迹避障模块五、基础知识学习与相关资…

R语言系列教程-----一起来学shiny吧(1)

什么是shiny?Shiny是一个R包,可让您轻松地直接从 R 构建交互式 Web 应用程序(应用程序)。本系列是个长教程,带你由浅入深学习shiny。 我们先使用系统自带的一个例子来介绍一下shiny,我们先导入shiny包 li…

RK3568开发笔记

一、了解MASKROM模式 出厂的时候,没有任何固件,但CPU有一块EPROM存储区,放有一个BOOTROM小启动程序。 这就是MASKROM模式。 使得首次烧写FLASH成为可能,不需要拆FLASH到烧录器上。 在MASKROM下,烧写UPDATE.IMG文件&…

Java实现碧蓝航线连续作战

目录一.实现功能二.主要思路三.代码实现四.用exe4j生成.exe程序五.最终效果六.代码开源一.实现功能 主线图作战结束到结算页自动点击再次前往 二.主要思路 判断是否进入了结算界面:记录结算界面某个像素点的RGB值,每隔3秒对这个像素点进行比对 移动鼠标…

浅入浅出keepalived+nginx实现高可用双机热备

对应用keepalivednginx技术实现nginx高可用进行简单的分析,下面是通过对keepalived添加校验nginx存活脚本,监控nginx的状态,应用keepalived的主备模式实现nginx的高可用。 假如192.168.100.2和192.168.100.3两台机器安装了nginx,负…

C++深入浅出(九)—— 多态

文章目录1. 多态的概念2. 多态的定义及实现🍑 多态的构成条件🍑 虚函数🍑 虚函数的重写🍑 虚函数重写的两个例外🍑 C11的override 和 final🍑 重载、覆盖(重写)、隐藏(重定义)的对比3. 抽象类🍑…

微信中如何接入chatgpt机器人才比较安全(不会收到警告或者f号)之第二步注入dll文件

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 前言 上一篇文章我们提到过,微信中如何接入chatgpt机器人才比较安全(不会收到警告或者f号)之第一步登录微信,需要的大家可以点进去看。 文接上篇,本文主要介绍如果将机器人接入到微信中的方法之一,别的方法后面专…

如何快速了解项目源文件的构成?基于 Node.js 实现项目源代码数据统计工具

当希望了解一个项目的代码规模时,首先可能会想对项目源文件的数量、类型分布、代码行数等做一下数据统计。使用 Linux/git 命令可以满足简单的统计需求,使用流行的 cloc 工具可以实现详细的源代码分析数据。此外也可以使用 Node.js 编码简单的实现个性化…

1.7配置OSPF手动汇总

实验7:配置OSPF手动汇总 实验目的实现OSPF路由汇总的配置阐明OSPF引入的外部路由时进行路由汇总的方法实验拓扑配置OSPF手动汇总实验拓扑如图1-17所示。 图1-17 配置OSPF手动汇总 实验步骤配置IP地址,配置OSPF(和实验6一致,此处略)在…

我还是学生,需要做副业吗?致各位迷茫的学生们

大家好,我是蝶衣王的小编,今天跟大家聊一聊,学生党应该做副业吗本文仅支持成人学生党查看,如果您还是未成年人,请立即退出本文。如今你唯一要做的就是好好学习,不要想那么多关于金钱的事,等到你…

CMMI-立项管理流程

立项管理(Project Initialization Management, PIM)的目的是:(1)采纳符合机构最大利益的立项建议,通过立项管理使该建议成为正式的项目(即合法化)。(2)杜绝不…

2023年阿里云活动有哪些实例规格的云服务器?如何选择这些实例规格

2023年阿里云活动有哪些实例规格的云服务器?新手用户通过阿里云活动选购阿里云服务器的时候实例规格应该怎么选,因为同配置的云服务器往往有多种不同是规格的云服务器可供选择,而且不同实例规格的云服务器之间价格差别还比较大,因…

CPP2022-28-期末模拟测试01

6-1 实现一个计算三角形面积的简单函数(假设输入的边长合理)。 分数 10 全屏浏览题目 切换布局 作者 王和兴 单位 东北大学秦皇岛分校 实现一个计算三角形面积的简单函数(假设输入的边长合理)。 函数接口定义: do…

Seata-server 源码学习(一)

Seata源码学习引入 学习了Seata的应用以后,我们从这开始要开始分析Seata的源码相关内容 源码下载 官方地址:https://seata.io/zh-cn/blog/download.html 通过idea打开seata-1.4.2版本的源码 回顾AT模式 其实在之前的应用课程中,我们已经用…

Windows 离线安装 MySQL 8

目录 1. 下载离线安装包 2. 上传解压 3 配置 my.ini 文件 4 设置系统环境变量 5 安装 MySQL 6 登录 MySQL 客户环境是内网环境,不能访问外网,只能离线安装 MySQL 了。 1. 下载离线安装包 MySQL 离线压缩包官网下载地址:MySQL :: Down…

Java基础面试题——面向对象和集合专题

文章目录1. 面向对象和面向过程的区别2. 介绍下Java中的基本数据类型3. 标识符的命名规则4. instanceof关键字的作用5.重载和重写的区别6.介绍下内部类7.介绍下Java中的四种引用8.HashCode的作用9.有没有可能两个不相等的对象有相同的hashcode10.深拷贝和浅拷贝的区别是什么?1…

STM32单片机DS18B20测温程序源代码

OLED液晶屏电路接口DS18B20电路接口STM32单片机DS18B20测温程序源代码#include "sys.h"#define LED_RED PBout(12)#define LED_GREEN PBout(13)#define LED_YELLOW PBout(14)#define LED_BLUE PBout(15)#define DS18B20_IO_IN() {GPIOA->CRL&0XFFFFFFF0;GPIOA…

使用Arthas定位问题

功能概述 首先,Arthas的常用功能大概有以下几个: 解决依赖冲突 sc命令:模糊查看当前 JVM 中是否加载了包含关键字的类,以及获取其完全名称。 sc -d 关键字 注意使用 sc -d 命令,获取 classLoaderHash命令&#xff1a…

Java 快速判断一个 IP 是否在给定的网段内

目录方法一:借助于 Java 提供的 InetAddress方法二:撸个算法实现(二进制计算)其他数字转为子网掩码要在Java中判断一个IP地址是否在给定的网段内,可以使用子网掩码将IP地址和子网掩码进行与操作来提取网络地址&#xf…