您的位置:首页 > 其它

ELK合集持续更新(十):Elasticsearch关键术语之倒排索引

2020-03-28 19:58 615 查看

Elasticsearch关键术语 系列博文 目的只用来了解概念 ; 其中 涉及到的配置和使用 是为了方便日后使用时查询的

倒排索引

正排索引 & 倒排索引

正排索引

根据 文档ID 查询 文档内容

倒排索引

根据 文档关键字 查询文档ID 关键字出现处的偏移量 词频

作用

每个field字段都有自己的倒排索引 可被搜索到

特性 – 不可变性

优点
  • 无需考虑并发写文件问题 避免了锁机制带来的性能问题

  • 一旦读入内核的文件系统缓存 便留在那里 只要文件系统有足够的空间 大部分请求会直接走内存 不命中磁盘 提升很大性能

  • 缓存易生成和维护 数据可被压缩

缺点

如果 需要让一个新文档可以被搜索 需要重建整个索引

相关概念

Lucene的index

  • Lucene中 单个倒排索引文件叫Lucene的segment 特点是 自包含的 不可变更的 多个sgement汇总在一起 叫lucene的index 对应es中的shard

  • 当有新文档写入时 会生成新的segment 查询时会同时查询所有segments 并对结果汇总 Lucene中有一个文件Commint Point用来记录所有segments信息

  • 删除的文档信息 保存在.del文件中

ES的refresh
  • 将index buffer写入segment的过程叫refresh refresh后 index buffer被清空 此时segment在缓存中 数据就可以被搜索到了 所以是近实时搜索 refresh不执行fsync操作 (fsync是将缓存中的segment写入磁盘)

  • 默认1s发生一次refresh

  • 如果有大量数据写入 会产生很多segment

  • index buffer被占满时 也会触发refresh 默认值是JVM的10%

配置refresh的时间

index.refresh_interval
transaction log
  • segment写入磁盘过程相对耗时 借助文件系统缓存refresh时 先将segment写入缓存以开发查询
  • 为了保证数据不会丢失 在index文档时 同时写入transaction log 默认落盘 每个分片有一个transaction log
  • 在es refresh时 index buffer会被清空 transaction log不会清空
ES的flush & Lucene的commit
  • 先调用refresh index buffer清空并refresh
  • 再调用fsync 将缓存中的segments写入磁盘
  • 再清空transaction log
  • 默认30分钟执行一次
  • 当transaction log写满时 也会触发 默认512MB
ES的merge
  • segment很多 需要被定期合并 以减少segment 并 真正删除.del文件中已删除的文档
  • ES会定期自动merge
  • 手动merge
    POST index名/_forcemerge

配置

  • 该字段不建立倒排索引 操作
    Index的Mapping中 可指定某些字段不建立倒排索引
  • 优点 生存储
  • 缺点
      字段无法被搜索

    组成

    Term Dictionary 单词词典

    作用

    • 记录所有文档的单词
    • 记录单词 到 倒排列表的 关联关系

    优化
    单词词典一般较大 可用Btree或哈希拉链算法 实现 高性能插入和查询

    Posting List 倒排列表

    概念
    由倒排索引项组成

    Posting 倒排索引项

    • 组成 文档ID
    • 词频TF
    • 位置Position 概念 单词在文档中分词的位置
  • 作用
      用于语句搜索phrase query
  • 偏移Offset
      概念 记录单词的开始结束位置
  • 作用
      用于高亮显示

    参考
    阮一名资料
    官方文档
    百度

    • 点赞
    • 收藏
    • 分享
    • 文章举报
    hungry和她的朋友们 发布了25 篇原创文章 · 获赞 0 · 访问量 357 私信 关注
  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: