当前位置: 首页 > news >正文

ES学习笔记

目录

简介

原理

基础概念

lucene总结

es的进步

实现过程

写入流程

搜索过程

和Mysql搭配


学习来源:https://i12pc3nf6d.feishu.cn/wiki/FnPwwGXGli1ANGkaMz5chvhmn2e#share-OYKJdYhehotnMgxrBiUcZSJJnCb

https://i12pc3nf6d.feishu.cn/wiki/FnPwwGXGli1ANGkaMz5chvhmn2e#share-OYKJdYhehotnMgxrBiUcZSJJnCb

简介

是一个开源的搜索引擎。

它介于应用和数据之间,只要将数据写入 es,应用就可以通过一些关键词搜索到数据。效果就像某度搜索一样。

原理

基础概念

正排:依次遍历文本匹配是否含有关键词

倒排:遍历关键词去搜索对应原始数据的id

分词:对文本进行切分

词项term:分词后的每部分。词项非常多,时间复杂度为O(N),按字典序从小到大排序,二分查找O(lgN)

排好序的词项Term Dictionary:包括term(词项)和对应的文档id(其实还包括词频、偏移量等等)

数据量很大,放内存并不现实,因此必须放在磁盘中。但查询磁盘是个较慢的过程

==》term index

提取词项相同的前缀,构成目录树term index

搜索出来的是文档id,获取文档内容本身==》Stored Fields(行式存储)存放文档id和对应的文档内容

根据某个字段排序文档,但是字段散落在文档中==》空间换时间的思路,再构造一个列式存储结构,将散落在各个文档的某个字段,集中存放

lucene总结

倒排索引用于搜索

Term Index 用于加速搜索【相同前缀,目录树】

Stored Fields 用于存放文档的原始信息

Doc Values 用于排序和聚合。

这些结构共同组成了一个复合文件segment,segment 一旦生成,则不能再被修改,所以旧的segment只负责读,新的segment 负责读和写;segment 一旦变多就有segment merging段合并

而多个segment组成lucene,一个单机的文本检索库

es的进步

es就是在lucene 的基础上实现了

高性能:对数据进行分类写入不同的lucene,把多操作分摊到多个分片shard 中去

高扩展:把shard 分散部署在多台机器

高可用:在不同node添加shard 的副本

涉及到集群部分:

Node角色分化:主节点负责管理集群;数据节点负责存储管理数据,协调节点负责接受客户端搜索查询请求

去中心化:选主,在 Node 间引入协调模块,用类似一致性算法 Raft 的方式,在节点间互相同步数据

实现过程

写入流程

  • 当客户端应用发起数据写入请求,请求会先发到集群中协调节点。

  • 协调节点根据 hash 路由,判断数据该写入到哪个分片(Shard),找到主分片并写入到 lucene 库里的 segment 内,将数据固化为倒排索引和 Stored Fields 以及 Doc Values 等多种结构。

  • 主分片 写入成功后会将数据同步给 副本分片

  • 副本分片 写入完成后,主分片会响应协调节点 ACK

  • 最后,协调节点响应客户端应用写入完成。

搜索过程

1. 查询阶段

  • 当客户端应用发起搜索请求,请求会先发到集群中的协调节点。

  • 协调节点根据 index name 的信息,可以了解到 index name 被分为了几个 分片,以及这些分片 分散哪个数据节点上,将请求转发到这些数据节点的 分片 上面

  • 搜索请求到达分片后,分片 底层的 lucene 库会并发搜索多个 segment,利用每个 segment 内部的倒排索引获取到对应文档 id,并结合 doc values 获得排序信息。分片将结果聚合返回给协调节点。

  • 协调节点排序聚合多个分片中拿到的数据,舍弃大部分不需要的数据。

2. 获取阶段

  • 协调节点再次拿着文档 id 请求数据节点里的 分片,分片 底层的 lucene 库会从 segment 内的 Stored Fields 中取出完整文档内容,并返回给协调节点。

  • 协调节点最终将数据结果返回给客户端。完成整个搜索过程

和Mysql搭配

【IT老齐268】ElasticSearch与MySQL如何搭配,很多人都弄错了_哔哩哔哩_bilibili

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 制作一个rabbitmq-sdk以及rabbitmq消费者实现定时上下线功能
  • 怎么让Nginx可以访问某一IP的每个后台controller接口
  • Html css样式总结
  • go语言 结构体
  • 低代码平台:数据筛选功能的全新变革
  • [Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis
  • 7款国内AI搜索引擎大全网站
  • Project Online 专业版部署方案
  • 周末总结(2024/09/22)
  • 使用 Fairseq 进行音频预训练:Train a wav2vec 2.0 base model配置与实现
  • 【C语言零基础入门篇 - 16】:栈和队列
  • IT行业中的工作生活平衡探讨
  • LeetcodeLCR 116. 省份数量
  • java项目之常规应急物资管理系统(源码+文档)
  • Study Plan For Algorithms - Part36
  • SegmentFault for Android 3.0 发布
  • 3.7、@ResponseBody 和 @RestController
  • avalon2.2的VM生成过程
  • Docker: 容器互访的三种方式
  • interface和setter,getter
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Making An Indicator With Pure CSS
  • node.js
  • opencv python Meanshift 和 Camshift
  • SOFAMosn配置模型
  • STAR法则
  • Swift 中的尾递归和蹦床
  • vue:响应原理
  • Windows Containers 大冒险: 容器网络
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 力扣(LeetCode)965
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 赢得Docker挑战最佳实践
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (1)Android开发优化---------UI优化
  • (2)(2.10) LTM telemetry
  • (2)空速传感器
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (多级缓存)缓存同步
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)jdk与jre的区别
  • (自用)网络编程
  • .htaccess配置重写url引擎
  • .Net Core 微服务之Consul(三)-KV存储分布式锁
  • .Net Core中Quartz的使用方法
  • .net framework profiles /.net framework 配置
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接