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/文档id

DELETE /索引库名/_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 操作时,更是可以直接跳过检索直接走缓存。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统论述题+第5、6、7、8、9章的知识小点总结(尤其是选择题)

文章目录 一、操作系统论述题怎么提高内存利用率&#xff1f;怎么提高CPU利用率&#xff1f;怎么提高操作系统并发度&#xff1f;这个答案也不知道是什么问题里面的 二、操作系统5、6、7、8、9章选择题知识点第五章&#xff1a;存储器管理第六章&#xff1a;虚拟存储器第七章&a…

Mysql-InnoDB-数据落盘

概念 1 什么是脏页&#xff1f; 对于数据库中页的修改操作&#xff0c;则首先修改在缓冲区中的页&#xff0c;缓冲区中的页与磁盘中的页数据不一致&#xff0c;所以称缓冲区中的页为脏页。 2 脏页什么时候写入磁盘&#xff1f; 脏页以一定的频率将脏页刷新到磁盘上。页从缓冲区…

TensorFlow Lite中文本分类在Android上的实践

#1 Tensorflow Lite TensorFlow Lite(后续简称TFL) 是 Google 开发的一个用于移动设备和嵌入式设备的开源库,旨在为移动终端设备提供机器学习推断。它是 TensorFlow 框架的轻量级版本,专门优化了模型的大小和性能,以适应资源受限的移动设备和嵌入式系统。 TFL 提供了一种在移…

【stm32】hal库学习笔记-FSMC连接TFT_LCD

【stm32】hal库学习笔记-FSMC连接TFT LCD 触摸屏结构与原理 LCD模块接口原理图 LCD 接口连接在 FSMC 总线上面&#xff0c;图中的 T_MISO/T_MOSI/T_PEN/T_SCK/T_CS 连接在 MCU 的 PB2/PF11/PB1/PB0/PC13 上&#xff0c;这些信号用来实现对液晶触摸屏的控制&#xff08;支持电阻…

go语言函数进阶

1.变量作用域 全局变量 全局变量是定义在函数外部的变量&#xff0c;它在程序整个运行周期内都有效。 在函数中可以访问到全局变量。 package mainimport "fmt"//定义全局变量num var num int64 10func testGlobalVar() {fmt.Printf("num%d\n", num) /…

Linux——文件系统

我们的计算机中一定会有文件&#xff0c;我在之前的博客中已经介绍了内存中的文 件&#xff0c;也就是被打开的文件。但是有被打开的&#xff0c;那就有没有被打开的文件&#xff0c; 这一部分文件是在磁盘中的。我们平时用到的无非就是通过路径找到它&#xff0c;然 后对它进行…

AOP+Redisson 延时队列,实现缓存延时双删策略

一、缓存延时双删 关于缓存和数据库中的数据保持一致有很多种方案&#xff0c;但不管是单独在修改数据库之前&#xff0c;还是之后去删除缓存都会有一定的风险导致数据不一致。而延迟双删是一种相对简单并且收益比较高的实现最终一致性的方式&#xff0c;即在删除缓存之后&…

前端实现界面切换

样式切换主题 常用的主题切换实现方式之一&#xff0c;就是通过 link 标签的 rel 属性来实现的 当 rel 标签的值是 alternate&#xff0c;就代表该样式是可以替换的 title 属性要加就全加上或者全不加&#xff0c;因为 title 会导致系统直接识别成样式文件&#xff0c;意思就是…

DevSecOps 度量指标介绍

目录 一、度量指标概述 1.1 概述 二、度量指标内容介绍 2.1 指标概览 2.1.1 指标概览说明 2.1.2 指标概览图 2.1.3 指标概览图说明 2.2 必选指标 2.2.1 必选指标含义说明 2.2.2 必选指标内容 2.3 可选指标 2.3.1 可选指标含义说明 2.3.2 可选指标内容 一、度量指标…

北京大学:警惕ChatGPT等大模型遏制人类的创新能力

‍ 导语&#xff1a;这篇论文通过实验和跟踪调查&#xff0c;探讨了ChatGPT在有无的情况下对创新能力的影响。虽然ChatGPT能提升人的创新表现&#xff0c;但是当它停止工作时&#xff0c;创新性会回归基线。更为重要的是&#xff0c;使用ChatGPT可能导致内容同质化&#xff0c;…

C#使用DateTime结构的ParseExact方法和Parse方法分别将字符串转化为日期格式

目录 一、涉及到的知识点 1.ParseExact(String, String, IFormatProvider) 2.DateTime.ToLongDateString 方法 3.Parse(String)方法 二、实例1&#xff1a;ParseExact方法 1.源码 2.生成效果 3.示例2 三、实例2&#xff1a;Parse方法 在程序设计过程中&#xff0c;经…

有趣的css - 好看的呼吸灯效果

整体效果 这个效果主要用 css3 的 animation 属性来实现的。 这个效果可以用作在网站的整体 Loading&#xff0c;也可以放在网站首屏当一个 banner 的背景也是非常棒的&#xff01; 代码部分 html 部分代码&#xff1a; <div class"app"><span class&quo…

4. MySQL 多表查询

重点&#xff1a; MySQL 的 三种安装方式&#xff1a;包安装&#xff0c;二进制安装&#xff0c;源码编译安装。 MySQL 的 基本使用 MySQL 多实例 DDLcreate alter drop DML insert update delete DQL select 3.5&#xff09;DDL 语句 表&#xff1a;二维关系 设计表&…

SAR图像目标识别的可解释性问题探讨

源自&#xff1a;雷达学报 作者&#xff1a;郭炜炜, 张增辉, 郁文贤&#xff0c;孙效华 “人工智能技术与咨询” 发布 摘 要 合成孔径雷达(SAR)图像目标识别是实现微波视觉的关键技术之一。尽管深度学习技术已被成功应用于解决SAR图像目标识别问题&#xff0c;并显著超越了…

扫描电子显微镜电子束辐射损伤和如何减轻

扫描电镜&#xff08;Scanning Electron Microscope, SEM&#xff09;是一种常用的材料表征技术&#xff0c;它通过聚焦电子束扫描样品表面&#xff0c;利用电子与样品相互作用产生的信号来获得高分辨率的形貌图像。然而&#xff0c;电子束的辐射可能会对样品造成损伤&#xff…

初探 Backstage:快速上手指南

坦白说&#xff0c;虽然我之前阅读过相关文档&#xff0c;但实际上从未亲自尝试运行 Backstage。我一直有种感觉&#xff0c;Backstage 不过是一个开发者门户而非开发者平台。上周在 分享我对平台工程的理解 后&#xff0c;朋友圈中有人提议我写一篇关于 Backstage 入门的文章。…

(M)unity受伤反弹以及死亡动画

受伤反弹 1.在人物控制脚本中添加受伤后速度将为0&#xff0c;并添加一个反弹的力 在刷新移动时&#xff0c;需要在没有受伤的状态 public bool isHurt; public float hurtForce; private void FixedUpdate() {if(!isHurt)Move(); }public void GetHurt(Transform attacker) …

11.1 StringBuffer类(血干JAVA系列)

StringBuffer类 11.1.1 认识 StringBuffer 类1.实例操作1——字符串连接操作(append)【例11.1】通过append()方法连接各种类型的数据【例11.2】验证StringBuffer的内容是可以修改的 2.实例操作2——在任意位置处为StringBuffer添加内容&#xff08;insert&#xff09;【例11.3】…

Mac本上快速搭建redis服务指南

文章目录 前言1. 查看可用版本2.安装指定版本的redis3.添加redis到PATH3.1 按照执行brew install命令后输出的提示信息执行如下命令将redis添加到PATH3.2 执行命令要添加的redis环境信息生效: 4. 增加密码4.1 在文件中找到requirepass所在位置4.2 去掉注释并将requirepass值替换…

微信小程序开发如何实现阴影/悬浮效果

显示&#xff1a; 实现&#xff1a; <view style"width: 100%;height: 500rpx; display: flex; justify-content:space-evenly;align-items: center; "><view style"width: 200rpx;height:100rpx;background-color: aqua; display: flex; align-item…