近实时搜索

  • 提交(Commiting)一个新的段到磁盘需要一个 fsync 来确保段被物理性地写入磁盘,这样在断电的时候就不会丢失数据。但是每次提交的一个新的段都fsync 这样操作代价过大。可以使用下面这种更轻量的方式
  • 在内存缓冲区中包含了新文档的 Lucene 索引
    • Lucene 允许新段被写入和打开--使其包含的文档在未进行一次完整提交时便对搜索可见
  • 缓冲区的内容已经被写入一个可被搜索的段中,但还没有进行提交
    • 这里新段会被先写入到文件系统缓存--这一步代价会比较低,稍后再被刷新到磁盘--这一步代价比较高
  • 默认情况下每个分片会每秒自动刷新一次
    • 近 实时搜索: 文档的变化并不是立即对搜索可见,但会在一秒之内变为可见
    • POST /_refresh // 刷新Refresh 所有的索引
    • POST /blogs/_refresh // 只刷新Refresh blogs 索引

      可以在settings 设置对定时刷新频率的大小

    PUT /my_logs

    {

    "settings": {

    "refresh_interval": "30s" //30秒刷新一次

    "refresh_interval": "-1" //关闭自动刷新

    "refresh_interval": "1s"//每秒自动刷新

    }

    }

    持久化变更

    在没有 fsync 把数据从内存刷新到硬盘中,我们不能保证数据在断电或程序退出时之后依然存在

  • 即时每秒刷新,也不能实现近实时搜索。我们任然有另外的方法确保从失败中回复数据
  • ES 增加一个translog,或者叫做事务日志。在每次操作是均进行日志记录
  • 整个流程是如下的操作
    1. 一个文档被索引之后,就会被添加到内存缓冲区,并且 追加到了 translog

      -

    2. 刷新(refresh)使分片处于缓存被清空,但是事务日志不会的状态
      • 内存缓冲区的文档被写入新的段中,但是没有进行fsync
      • 段被打开,且可被搜索到
      • 内存缓冲区被清空
    3. 进程继续进行,更多的文档被添加到内存缓冲区和追加的事务日志中
    4. 每隔一段时间,translog太大 或 索引被刷新。一个新的translog被创建,并且被全量提交

      -

      • 所有内存缓冲区的文档都被写入一个新的段中
      • 缓冲区内清空
      • 一个提交点被写入硬盘
      • 文件系统缓存通过fsync被刷新
      • 老的translog 被删除
  • translog 提供所有没有被刷新到磁盘操作的一个持久化记录。当ES启动时,会根据最后一个提交点去恢复已知的段
  • translog 也可供用来提供实时的CRUD。但我们进行一些CRUD操作时,它会首先检查translog任何最近的变更。
  • flush API 执行一次提交,并截断translog的操作
    • 分片默认每30M自动flush一次。translog太大也会自动flush
    • 可通过自己执行flush API操作

      POST /blogs/_flush //刷新索引

      POST /_flush?wait_for_ongoing //刷新索引并等待所有的刷新结果返回

段合并
  • 段合并的时候会将那些旧的已删除的文档从文件系统中删除,被删除或者被更新的文档不会被复制到新的大段中
  • 段合并的流程

    -

    • 当索引的时候,刷新(refresh)操作会创建新的段
    • 合并的时候会选择一部分大小相似的段,并且将其合并到更大的段中
    • 段的合并结束,老的段就要被删除
  • optimized API 的作用
    • optimize API大可看做是 强制合并 API 。

ElasticSearch 学习记录之ES如何操作Lucene段的更多相关文章

  1. ElasticSearch 学习记录之ES几种常见的聚合操作

    ES几种常见的聚合操作 普通聚合 POST /product/_search { "size": 0, "aggs": { "agg_city&quo ...

  2. ElasticSearch 学习记录之ES短语匹配基本用法

    短语匹配 短语匹配故名思意就是对分词后的短语就是匹配,而不是仅仅对单独的单词进行匹配 下面就是根据下面的脚本例子来看整个短语匹配的有哪些作用和优点 GET /my_index/my_type/_sea ...

  3. ElasticSearch 学习记录之ES高亮搜索

    高亮搜索 ES 通过在查询的时候可以在查询之后的字段数据加上html 标签字段,使文档在在web 界面上显示的时候是由颜色或者字体格式的 GET /product/_search { "si ...

  4. ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询

    ES添加排序 在默认的情况下,ES 是根据文档的得分score来进行文档额排序的.但是自己可以根据自己的针对一些字段进行排序.就像下面的查询脚本一样.下面的这个查询是根据productid这个值进行排 ...

  5. ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理

    分布式文档存储 ES分布式特性 屏蔽了分布式系统的复杂性 集群内的原理 垂直扩容和水平扩容 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中 ES集群特点 ...

  6. ElasticSearch 学习记录之如任何设计可扩容的索引结构

    扩容设计 扩容的单元 一个分片即一个 Lucene 索引 ,一个 Elasticsearch 索引即一系列分片的集合 一个分片即为 扩容的单元 . 一个最小的索引拥有一个分片. 一个只有一个分片的索引 ...

  7. ElasticSearch 学习记录之父子结构的查询

    父子结构 父亲type属性查询子type 的类型 父子结构的查询,可以通过父亲类型的字段,查询出子类型的索引信息 POST /product/_search { "query": ...

  8. ElasticSearch 学习记录之Text keyword 两种基本类型区别

    ElasticSearch 系列文章 1 ES 入门之一 安装ElasticSearcha 2 ES 记录之如何创建一个索引映射 3 ElasticSearch 学习记录之Text keyword 两 ...

  9. Elasticsearch学习记录(分布式的特性)

    Elasticsearch学习记录(分布式的特性) 分布式的特性 我们提到Elasticsearch可以扩展到上百(甚至上千)的服务器来处理PB级的数据.然而我们的例子只给出了一些使用Elastics ...

随机推荐

  1. 13. ZooKeeper最佳实践

    以下列举了运行和管理ZooKeeper ensemble的一些最佳实践: ZooKeeper数据目录包含快照和事务日志文件.如果autopurge选项未启用,定期清理目录是一个好习惯.另外,管理员可能 ...

  2. JavaScript提高篇之面向对象之单利模式工厂模型构造函数原型链模式

    1.单例模式 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  3. Centos7.0 下挂载磁盘

    参考:

  4. svn 如果遇到an unversioned directory of the same name already exists的解决办法

    svn 如果遇到an unversioned directory of the same name already exists的解决办法 一般这种情况是因为,在一个已经存在的文件夹里做SVN che ...

  5. java把html标签字符转普通字符(反转换成html标签)(摘抄)

    下面是java把html标签字符转换,我用了spring 包中的 org.springframework.web.util.HtmlUtils 了解了源代码并且进步了使用,发现写得真不错...同时也可 ...

  6. 可以在手机上看电脑本地html步骤,我自己总结的哦!

    1.打开控制面板 2.打开程序和功能 3.打开或关闭功能 4.internet信息服务展开后里面所有的都要选中 5.回到桌面,然后右键计算机,选择'管理' 6.先在E盘或者D盘创建一个文件夹,自己随意 ...

  7. replicated mode vs global mode - 每天5分钟玩转 Docker 容器技术(105)

    Swarm 可以在 service 创建或运行过程中灵活地通过 --replicas 调整容器副本的数量,内部调度器则会根据当前集群的资源使用状况在不同 node 上启停容器,这就是 service ...

  8. kubernetes nginx ingress 使用记录

    前言 ingress是一种可以暴露k8s集群内部service的方式,用户编辑配置文件定义一个ingress资源即可实现外部网络访问内网service. ingress controller是来管理所 ...

  9. 开发H5基本知识摘要

    一:开发平台 我在公司开发app主要是在apicloud平台上https://www.apicloud.com/,需要开发的同学可以点击进入这个平台了解: 二:开发工具 既然是在apicloud平台上 ...

  10. centos编译安装php5.6.20+nginx1.8.1+mysql5.6.17

    LNMP 代表的就是:Linux系统下Nginx+MySQL+PHP这样的站点服务器架构. 本次实践需求: 实践centos6.5编译安装 LNMP生产环境 架构 web生产环境 使用 xcache ...