ElasticSearch 学习笔记

基本概念

术语

  1. 文档(document):每条记录就是一个文档,会以 JSON 格式进行存储
    JSON 存储
  2. 映射(mapping):索引中文档字段的约束信息,类似 RDBMS 中的表结构约束(schema)
  3. 词条(term):对文档内容分词得到的词语,是索引里面最小的存储和查询单元
  4. 词典(term dictionary):由文本集合中出现过的所有词条所组成的集合
  5. 词条索引(term Index):为了在词典中快速找到某个词条,需要为词条建立索引。通过压缩算法,词条索引的大小只有所有词条的几十分之一,因此词条索引可以存储在内存中,从而提供更快的查找速度
  6. 倒排表(posting list):记录词条出现在哪些文档里,以及出现的位置和频率等信息。倒排表中的每条记录称为一个倒排项(posting)
  7. 索引(index):相同类型(文档结构)的文档集合

索引前的文档集合:
索引前的文档集合
索引后的文档集合:
索引后的文档集合
8.

比较

  1. RDBMS vs ES
    RDBMS vs ES
  2. 使用场景:MySQL 擅长于事务类型操作,可以确保数据的安全性和一致性;ES 则擅长于海量数据的检索、分析与计算。

MySQL + ES 组合使用架构:
MySQL + ES 组合使用架构

语法

DDL
类型

字段类型
注意:index 默认为 true,即 ES 会默认给设置的字段设置倒排索引,如无需设置倒排索引需要手动设置为 false

语法示例
PUT /索引库名称
{"mappings": { // 定义 schema"properties": { // schema 的具体字段极其类型说明"字段1": {"type": "text""analyzer": "ik_smart"},"字段2": {"type": "keyword","index": false},"字段3": {"type": "object","properties": { // 嵌套字段"子字段1": {"type": integer"index": false}}}}}
}GET /索引库名DELETE /索引库名// ES 禁止修改索引库已有字段,只允许新增字段
PUT /索引库名/_mapping
{"properties": {"新字段名": {"type": "long""index": false}}
}
DML
新增文档
POST /索引库名/_doc/文档id
{"字段1": "值1","字段2": {"子字段1" : "子值1"}
}
查询/删除文档
GET /索引库名/_doc/文档idDELETE /索引库名/_doc/文档id
修改文档
  1. 全量修改
PUT /索引库名/_doc/文档id
{"字段1": "值1","字段2": {"子字段1" : "子值1"}
}

注意:当 文档id 指定的文档不存在时,就是新增文档

  1. 局部修改
POST /索引库名/_update/文档id
{"doc": {"字段2": {"子字段1" : "子值1"}}
}
DSL 查询

常见 DSL 查询

语法
全文检索

会先对用户输入的类型进行「分词」,然后去倒排索引库去检索

// 全部查询
GET /索引库名/_search
{"query": {"match_all": {}}
}// match 查询
GET /索引库名/_search
{"query": {"match": {"字段名": "字段值"}}
}// multi_match 查询,注意参与查询字段越多,查询性能越差
GET /索引库名/_search
{"query": {"multi_match": {"query": "字段值""fields": ["字段名1", "字段名2"]}}
}
精确查询

直接使用提供的值进行匹配查询,而不会先进行分词操作

// term 查询
GET /索引库名/_search
{"query": {"term": {"字段名": {"value": "字段值"}}}
}// range 查询
GET /索引库名/_search
{"query": {"range": {"字段名": {"gte": "字段值1", // >="lte": "字段值2", // <=}}}
}
地理查询
复合查询

function score 函数
打分算法原理

TF刻画了词语w对某篇文档的重要性,IDF刻画了w对整个文档集的重要性。TF与IDF没有必然联系,TF低并不一定伴随着IDF高。实际上我们可以看出来,IDF其实是给TF加了一个权重。

打分算法原理
新版 ES 都默认使用 BM25 作为打分算法。

BM25 考虑到了文档长度对于 TF 的影响。在 TF-IDF 中,长文档可能会因为包含更多的词而得到较高的 TF 值。为了消除这种影响,BM25 引入了文档长度归一化,使得长文档和短文档在计算 TF 时能够处于同一水平。BM25 相对 TF-IDF 有哪些优势?

TF-IDF 存在的问题

  1. 在一个相当长的文档中,像 the 和 and 这样词出现的数量会高得离谱,以致它们的权重被人为放大。

IDF vs BM25

  • Bool 查询
    bool 查询
搜索结果处理
排序

排序语法

分页

分页语法及其实现原理
深分页问题
深分页问题
深分页解决方案:
深分页解决方案
ES 深分页问题解决方案

search_after 是 ES 5 新引入的一种分页查询机制,其实 原理几乎就是和 scroll 一样,简单总结如下:

  1. 必须先要 指定排序;
  2. 必须 从第一页开始;
  3. 从第一页开始,以后每次都带上 search_after=lastEmittedDocFieldValue 从而为无状态实现一个状态,其实就是把每次固定的 from + size 偏移变成一个确定值 lastEmittedDocFieldValue,而查询则从这个偏移量开始获取 size 个 _doc(每个 shard 获取 size 个,coordinate node 最后汇总 shards * size 个)。

也就是说,无论去到多少页,coordinate node 向其它 node 发送的请求始终就是请求 size 个 docs,是个常量,而不再是 from + size 那样,越往后你要请求的 docs 就越多,而要丢弃的垃圾结果也就越多。也就是说,如果要做非常多页的查询时,最起码 search_after 是一个常量查询延迟和开销。

高亮

高亮语法及其原理
注意:ES 默认要求搜索字段与高亮字段一致才会高亮显示。设置 “require_field_match”: false 则可以忽视该规定

倒排索引原理

倒排索引建立的是分词(Term)和文档(Document)集合之间的映射关系,在倒排索引中,数据是面向词(Term)而不是面向文档的。

在数据生成的时候,比如插入一份文档,内容是“小米手机与华为手机”,这个时候通过使用分词器,会将它分解为“小米”、“手机”、“与”、“华为”四个词语,然后可能还会把“与”这个无具体意义的关联词语干掉,最后生成一张倒排表。
倒排索引
每搜索一个单词,就对倒排表进行全局遍历,效率特别低,所以需要对倒排表进行排序,以便采用二分查找等方式提高遍历效率。另一方面,光使用排序还会因磁盘 IO 导致查询速度过慢,若将数据放全部入内存,又会导致内存爆满。所以,在倒排表的基础上,又通过 FST (trie、FSA、FST(转))的形式引入了 term index,它不存储所有的单词,只存储单词前缀,并将其完全放入到内存中,通过字典树找到单词所在的块(单词的大概位置),再在块里进行二分查找,找到对应的单词,再找到单词对应的文档列表。
在这里插入图片描述

FST

Lucene的FST(Finite-State Transducers)是一种高效的数据结构(变种的trie树,trie树只共享了前缀,而 FST 既共享前缀也共享后缀。),是Lucene用来构建和管理自动机的一部分,它具有高度的压缩性和空间效率,能够帮助Lucene提高搜索和排序的效率。在FST中,任何字符串都可以看作一个有限状态机,每个状态代表着字符串的某个前缀。FST基于原理:序列化哈希值,通过将无序键序列化到字节数组中,强制所有的比较和排序在序列化字节上进行。

聚合

聚合

自动补全

type: “completion”

数据同步

场景

  1. ElasticSearch 结合工具 LogStash、 Kibana (ELK)进行日志分析、实时监控。

问题

慢查

  1. 使用 search 查询时,指定的查询条件不够精准,导致查询范围过大
  • 返回的 id 过多,在协调节点做排序截断时,会产生比较大的 CPU 压力
  • 返回的 id 过多,会导致第二步通过 id 请求数据 node 获取文档详细时,使得数据节点以及协调节点产生大量的 IO 操作,以及 CPU 消耗

seaerch 查询

GET /my-index/_search

ES 查询原理图-search查询

  1. Client 将请求发送到任意节点 node,该 node 节点成为协调节点(coordinating node)
  2. 协调节点进行分词等操作后,去查询所有的数据节点 shard (primary shard 和 replica shard 选择一个)
  3. 所有数据节点 shard 将满足条件的数据 id、排序字段等信息返回给协调节点
  4. 协调节点重新进行排序,再通过截取数据后获取到真正需要返回的数据 id
  5. 协调节点再次请求对应的数据节点 shard (此时有 id 了,可以直接定位到对应 shard),获取数据文档
  6. 协调节点从数据节点获取到全量数据文档后将其返回给 Client

ID 查询

GET my-index/_doc/0

ES 查询原理图-id查询

  1. Client 将请求发送到任意节点 node,该 node 节点就是协调节点(coordinating node)。
  2. 协调节点对 id 进行路由,从而判断该数据在哪个 shard。
  3. 从 primary shard 和 replica shard 随机选择一个,请求获取 doc。
  4. 接收请求的节点会将数据返回给协调节点,协调节点会将数据返回给 Client

其它

  1. ElasticSearch 高手之路:ES 查询语法文档
  2. Elasticsearch 倒排索引原理
  3. 为什么 ElasticSearch 比 MySQL 更适合复杂条件搜索

思考

ElaticSearch 为什么快

在这里插入图片描述

ES vs MySQL

Elasticsearch 比 MySQL 快的原因

  1. 基于分词后的全文检索:例如 select * from test where name like ‘%张三%’,对于 mysql来说,因为索引失效,会进行全表检索;对 ES 而言,分词后每个字都可以利用 FST 高速找到倒排索引的位置,并迅速获取文档 id 列表,大大的提升了性能,减少了磁盘IO。
  2. 精确检索:有时 MySQL 可能更快一些,比如当 MySQL 通过索引覆盖,无需回表查询时;ES 始终会通过 FST 找到倒排索引的位置获取文档 id 列表,再根据文档id获取文档并根据相关度进行排序。另外 ES 还有个优势,分布式架构使其在进行大量数据搜索时,可以通过分片降低检索规模,并且通过并行检索提升效率,使用 filter 操作时,更是可以直接跳过检索直接走缓存。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LIBS】交叉编译TCPDUMP

目录 1. 安装编译工具2. 设置环境变量3. 编译libpcap3.1 安装依赖3.2 交叉编译 4. 编译TCPDUMP4.1 克隆仓库与生成构建环境4.2 静态链接LIBPCAP4.3 动态链接LIBPCAP4.4 构建与安装 5. 查看交叉编译结果5.1 文件布局 1. 安装编译工具 sudo apt-get install -y autoconf automak…

[MRCTF2020]Ez_bypass1

代码审计&#xff0c;要求gg和id的MD5值相等而gg和id的值不等或类型不等 相同MD5值的不同字符串_md5相同的不同字符串-CSDN博客 不过这道题好像只能用数组 下一步是passwd不能是纯数字&#xff0c;但是下一个判断又要passwd等于1234567 这里通过passwd1234567a实现绕过 原…

Differentiated Key-Value Storage Management for Balanced I/O Performance——论文泛读

ATC 2021 Paper 论文阅读笔记整理 问题 现代键值&#xff08;KV&#xff09;存储采用LSM树作为管理KV对的核心数据结构&#xff0c;但存在较高的写放大和读放大问题。现有的LSM树优化通常需要做出设计权衡&#xff0c;并无法同时在写入、读取和扫描方面实现高性能。 现有方法…

QT发生弹出警告窗口

QTC开发程序弹出警告窗口&#xff0c;如上图 实施代码&#xff1a; #include <QMessageBox> int main() {// 在发生错误的地方QMessageBox::critical(nullptr, "错误", "发生了一个错误&#xff0c;请检查您的操作。");}上面的文字可以更改&#x…

线性代数--------学习总结

高斯消去法&#xff1a;对于任意的矩阵&#xff0c;总是能够利用倍加和行变换的方法变化成为阶梯形矩阵&#xff08;每一行第一个非零元叫做主元&#xff0c;他所在的列就叫做主列------每一行的主列都在他上方任意一行主列的右边&#xff09;和行简化阶梯矩阵&#xff08;主元…

【Web前端实操17】导航栏效果——滑动门

滑动门 定义: 类似于这种: 滑到导航栏的某一项就会出现相应的画面,里面有对应的画面出现。 箭头图标操作和引用: 像一些图标,如果需要的话,可以找字体图标,比如阿里巴巴矢量图标库:iconfont-阿里巴巴矢量图标库 选择一个——>添加至购物车——>下载代码 因…

精通Python第13篇—数据之光:Pyecharts旭日图的魔法舞台

文章目录 引言准备工作绘制基本旭日图调整颜色和样式添加交互功能定制标签和标签格式嵌套层级数据高级样式与自定义进阶主题&#xff1a;动态旭日图数据源扩展&#xff1a;外部JSON文件总结 引言 数据可视化在现代编程中扮演着重要的角色&#xff0c;而Pyecharts是Python中一个…

【学网攻】 第(13)节 -- 动态路由(OSPF)

系列文章目录 目录 系列文章目录 文章目录 前言 一、动态路由是什么&#xff1f; 二、实验 1.引入 实验拓扑图 实验配置 实验验证 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学…

Python爬虫请求库安装

请求库的安装 爬虫可以简单分为几步&#xff1a;抓取页面、分析页面和存储数据。 在抓取页面的过程中&#xff0c;我们需要模拟浏览器向服务器发出请求&#xff0c;所以需要用到一些 Python 库来实现 HTTP 请求操作。在本教程中&#xff0c;我们用到的第三方库有 requests、S…

(自用)learnOpenGL学习总结-高级OpenGL-立方体贴图

ok终于来到了立方体贴图了&#xff0c;在这里面我们可以加入好看的天空包围盒&#xff0c;这样的画我们的背景就不再是黑色的了&#xff01; 首先&#xff0c;立方体贴图和前面的sampler2D贴图一样&#xff0c;不过是6个2D组成的立方体而已。 那么为什么要把6个组合在一起呢&…

Go、容器以及Linux调度器

在容器中运行Go应用程序时&#xff0c;需要设置合理的GOMAXPROCS&#xff0c;从而避免调度中因为资源不足而造成STW。原文: Go, Containers, and the Linux Scheduler Go开发的应用程序通常部署在容器中。在容器中运行时&#xff0c;重要的一点是要设置CPU限制以确保容器不会耗…

MacOS X 中 OpenGL 环境搭建 Makefile的方式

1&#xff0c;预备环境 安装 brew&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 安装glfw&#xff1a; brew install glfw 安装glew&#xff1a; brew install glew 2.编译 下载源代码…

喜报|「云原生数据库PolarDB」、「阿里云瑶池一站式数据管理平台」揽获“2023技术卓越奖”

日前&#xff0c;国内知名IT垂直媒体&技术社区IT168公布2023年“技术卓越奖”评选结果&#xff0c;经由行业CIO/CTO大咖、技术专家及IT媒体三方的联合严格评审&#xff0c;阿里云瑶池数据库揽获两项大奖&#xff1a;云原生数据库PolarDB荣获“2023年度技术卓越奖”&#xf…

【双目】双目精度评估完整方案,可以直接使用(内涵数据,代码和评估报告)

【双目】基于findChessboardCorners的双目精度评估&#xff0c;可以直接使用 数据和代码见 运行结果&#xff1a; 结论与分析&#xff1a; 在使用鱼眼相机进行双目精度上限评估时&#xff0c;出现1米距离的误差大于2米距离的误差可能有几个原因&#xff1a; 畸变影响&#x…

网络协议与攻击模拟_09部署DHCP服务器

一、部署DHCP服务器 Windows server部署DHCP服务器 1、虚拟机网络架构理解 Vmware里面不同的虚拟机可以设置相同的Vmnet网络&#xff0c;也可以设置不同的Vmnet网络。两台虚拟机设置相同的Vmnet1网卡&#xff0c;可以看作为使用虚拟交换机将两台Vmnet1的虚拟机连接起来的。 …

深入理解HarmonyOS UIAbility:生命周期、WindowStage与启动模式探析

UIAbility组件概述 UIAbility组件是HarmonyOS中一种包含UI界面的应用组件&#xff0c;主要用于与用户进行交互。每个UIAbility组件实例对应最近任务列表中的一个任务&#xff0c;可以包含多个页面来实现不同功能模块。 声明配置 为了使用UIAbility&#xff0c;首先需要在mod…

【C/C++】C/C++编程——变量和常量

文章目录 变量变量的声明变量命名规则变量的类型 常量常量的定义与初始化字面量常量整型常量浮点型常量字符常量常量表达式&#xff08;constexpr&#xff09; 大家好&#xff0c;我是 shopeeai&#xff0c;也可以叫我虾皮&#xff0c;中科大菜鸟研究生。今天我们来一起来学习C…

2.【Vue3】Vue 基本使用——局部使用Vue

1. 快速入门 现在需要将 “hello vue3” 这样一个字符串渲染到页面上进行展示。 这个需求并不陌生&#xff0c;可以使用原生 JS 代码完成&#xff1a; let msg"hello vue3"; document.getElementById("元素的id属性值").innerHTMLmsg;接下来学习如何使用…

麒麟系统—— openKylin 安装 mongodb

麒麟系统—— openKylin 安装 mongodb 一、准备工作1. 确保麒麟系统 openKylin 已经安装完毕。 二、下载解压 MongoDB二、增加环境变量三、配置MongoDB创建数据目录创建日志文件运行 四、加入到服务中 MongoDB是一款高性能、开源的NoSQL数据库&#xff0c;因其灵活的数据结构、…

机器学习:梯度下降法(Python)

LinearRegression_GD.py import numpy as np import matplotlib.pyplot as pltclass LinearRegression_GradDesc:"""线性回归&#xff0c;梯度下降法求解模型系数1、数据的预处理&#xff1a;是否训练偏置项fit_intercept&#xff08;默认True&#xff09;&…