一、倒排索引

  1. 倒排索引
    词项(term) : 搜索时的一个单位,代表文本中某个词
    倒排索引结果是一种将词项映射得到文档的数据结构
  2. 倒排索引建立步骤
    a. 提取词项
    首先对文档分词,英文文档用空格分隔
    去除无实际意义的词,如is、a、in、as等
    对单词统一大小写
    单复数,过去式、进行时转换
    过滤标点符号
    【本步骤,将无用的过滤掉并统一词项格式】
    b. 建立倒排索引
    将词项映射到文档
    【将提取的词项,映射到文档,一个词项可对应多个文档】
    c. 建立词项出现的频率、位置和偏移量
    文档ID:用于根据词项定位文档的原始信息
    频率:记录词项在文档出现的次数,用于搜索相关性算分
    位置:记录在文档中是第几个关键字,用于词组查询
    偏移量:记录开始和结束的位置,用于做高亮显示

二、 底层内部原理

  1. 倒排索引不可变性
    倒排索引写进磁盘永不会被改变
  • 因此无需锁,不必担心多进程同时修改数据问题

  • 大部分读请求直接请求内存,不命中磁盘

  • 不会因为数据改变而重建缓存中数据

  • 单个大的倒排索引允许数据被压缩

  • 不支持部分文档更新

  • 新文档可被搜索,需重建整个倒排索引,限制索引包含数据量,索引更新频率

  1. Lucene按段搜索(per-segment)
  • 段文件(segment file):存储倒排索引的文件,每个segment是一个倒排索引。文档写入lucene,并且生成完整的segment后才能被搜索
  • 提交点(Commit point):记录所有已知段的文件
  • 事务日志(translog):防止es宕机导致数据丢失,es每次写入数据同时写入translog。

ps:在倒排索引的不可变前提下,实现倒排索引的数据增删改

  • 使用更多索引,按段搜索
  • 一个lucene索引包含:segment的集合、Commit point文件
  • 按segment搜索,每个segment是一个倒排索引,通过增加新的索引反应最近的修改,而不重写整个倒排索引,当有数据查询请求,每个倒排索引都被遍历,从最早的开始,查询完后对结果合并。
  • 实现按段搜索,索引工作流程
    1. 当新文档被索引时,先收集到内存缓存
    1. (提交缓存)将缓存中对象转换为segment存储到磁盘,在Commit point 记录新段信息
    1. (开启新段)新的段被open,此时新段包含的文档可被搜索
    1. 清空内存缓存数据,等接受新文档
  • 文档的删除和更新
    1. 每个Commit point 包含一个.del文件,该文件会列出这些被删除文档的段信息
    1. 当一个文档被删时,实际只在.del文件中被标记删除,被标记删除的文档依然可被查询得到,但在最终结果被返回前从结果集中删除
    1. 当一个文档更新时,旧文档被标记删除,新文档被索引到一个新的段,两个文档可能被一个查询匹配到,但在结果返回前会在结果集中删除
  • ps:段合并后,标记删除的文档会移除
  • 查询流程
    1. 查询被触发
    1. 从Commit point 获取已知段信息,按顺序查询所有段
    1. 聚合所有段的查询结果
    1. 较小成本实现新文档添加到索引
  • 按段搜索的问题
    1. 每次commit一个新segment,需将数据fsync到物理磁盘,fsync代价大,每次索引一个文档就fsync一次,代价很大
  1. 近实时
  • 为解决按segment搜索的问题,先将写入内容缓存的lucene数据转换为segment存入文件系统缓存,等合适时机再将文件系统缓存中的数据提交,fsync到磁盘持久化

    1. 先将文档写入内存缓存
    1. 将内存缓存中数据转为segment,存入文件系统缓存,重新reopen,该过程是refresh(一般1秒refresh一次)
    1. 等合适时机,将文件系统缓存中数据提交,fsync到磁盘持久化
  • 引入文件系统缓存的遗留问题

    1. 没flush到磁盘的数据,若发生断电、宕机,缓存数据会丢失
  • 断电、宕机数据不丢失

  • es引入translog模块,将将数据同时写入内存缓存(lucene)和translog,数据发生丢失时,可从translog重新将数据恢复

  1. es索引数据完整流程
    1. 写lucene和translog
  • 当索引文档(写数据时),先将文档写入lucene,此时lucene在内存中,然后写translog,写成功后将请求发给用户
    1. 使搜索可见
  • 将内存中对象转为segment,再reopen,该操作为refresh
    1. 刷Translog日志
  • 将内存中的translog刷到磁盘,默认5秒一次
    1. 执行lucene提交(flush)
  • 将内存中segment刷到磁盘,更新commit point,清空translog,打开新的translog,默认translog达到512M,flush一次
  1. 段合并
  • 自动refresh,每秒会创建一个新的segment,不加处理会导致搜索变慢
  • 段合并流程
    1. 合并进程选一部分大小相似的segment,在后台 合并到更大的segment,不会中断索引和搜索
    1. 合并结束后,老segment被删,新segment被flush到磁盘,写入一个包含新segment且排除旧的和较小的segment,新的commit point
    1. 新的segment被用来搜索,老的segment被删

6.X elasticsearch实战学习笔记_底层原理相关推荐

  1. 唤醒手腕Python全栈工程师学习笔记(底层原理篇)

    01.内建名称空间 在Python中,有一个内建模块,该模块中有一些常用函数,变量和类. 而该内建模块在Python启动后.且没有执行程序员所写的任何代码前,Python首先会自动加载该内建模块到内存 ...

  2. Elasticsearch核心技术与实战学习笔记 43 | 分页与遍历:From, Size, Search After Scroll API

    一 序 本文属于极客时间Elasticsearch核心技术与实战学习笔记系列. 二 分页 2.1 From / Size 默认情况下,查询按照相关度算分排序,返回前 10 条记录 容易理解的分页方案 ...

  3. 第71课:Spark SQL窗口函数解密与实战学习笔记

    第71课:Spark SQL窗口函数解密与实战学习笔记 本期内容: 1 SparkSQL窗口函数解析 2 SparkSQL窗口函数实战 窗口函数是Spark内置函数中最有价值的函数,因为很多关于分组的 ...

  4. 唐金州的Vue开发实战学习笔记(生态篇)

    Vue开发实战学习笔记 Vuex Why Vuex How Vuex Vuex的核心概念和底层原理 Vuex的最佳实践 Vue Router Why Vue Router 路由类型及底层原理 Nuxt ...

  5. oracle11g中用asmlib配置磁盘组,ASM学习笔记_配置ASMLIB磁盘组

    ASM学习笔记_配置ASMLIB磁盘组 目录 1 ASMLIB Introduction 2 虚拟机添加一个共享磁盘(块设备) 3 下载,安装ASMLIB 4 配置,使用ASMLib 磁盘组 #### ...

  6. MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结

    MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结 一.VARCHAR存储和行长度限制 1.VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是 ...

  7. Java 8 实战学习笔记

    Java 8 实战学习笔记 @(JAVASE)[java8, 实战, lambda] 文章目录 Java 8 实战学习笔记 参考内容 Lambda表达式 Lambda环绕执行模式(抽离步骤) 原始代码 ...

  8. 系统架构师学习笔记_第六章(下)_连载

    系统架构师学习笔记_第六章(下)_连载 6.3 基于 UML 的软件开发过程 6.3.1  开发过程概述 UML 是独立于软件开发过程的,能够在几乎任何一种软件开发过程中使用.迭代的渐进式软件开发过程 ...

  9. Linux性能优化实战学习笔记:第四十六讲=====实战分析

    Linux性能优化实战学习笔记:第四十六讲 一.上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU.内存.文件系统和磁盘 I/O.以及网络的性能分析和优化.相信你已经掌握了这些基础模 ...

最新文章

  1. python json文件_python读写json文件的简单实现
  2. 长途每分钟只要9分钱!
  3. 指针:自定义函数sumDiff(),调用它来求两个数的和、差
  4. 免费软件做的不错的,这里要说一个叫《飞秋》的软件
  5. [5] ADB 与应用交互
  6. 来聊一聊window.fetch
  7. 2017.4.19 多项式输出 思考记录
  8. 操作系统 第一章 计算机系统概述
  9. LeetCode刷题——283. 移动零
  10. ORM框架,sqlsugar学习一
  11. 【摄影测量原理】第一章:摄影测量学基础
  12. 总结几款国内外在线的神级抠图工具
  13. 2019谷歌开发者大会
  14. 从企业实务角度解读 ITIL4 之14个通用管理实践
  15. 【连载之一】那些公众号不会告诉你的职业真相
  16. Win10安装Neo4j
  17. 转载:http://www.zzslxx.com/wmy/jy/Chap02/2.1.1.1.htm
  18. HDFS DataNode高密度存储机型的探索尝试
  19. 计算机键盘无法使用的原因,电脑键盘失灵的原因及其解决方法
  20. win10怎么用计算机的搜索,win10搜索文件内容怎么操作_win10如何搜索文档内的内容...

热门文章

  1. 7.联合索引(最左前缀原则)
  2. 12. 整数转罗马数字 (Java解题 贪心思想)
  3. js语句末尾是否需要加分号?
  4. 浅谈高并发-前端优化
  5. TCP/IP传输层协议实现 - TCP的超时与重传(lwip)
  6. python.exe应用程序错误_pythonw.exe应用程序错误
  7. C# 学习笔记9 接口,反射,单元测试
  8. 最最完整的二维码生成教程:MFC下利用libqrencode库生成二维码,显示在屏幕上并保存
  9. 利用CSS实现爱心跳动案例--浪漫爱心表白
  10. Java获取系统当前时间