lucene里的segment

这章来记录一下lucene里的segment。segment是索引中最小的独立存储单元。一个索引文件由一个或多个段组成。segment内部主要有:

  • Inverted Index
  • Sorted Fields
  • Document Values
  • Cache

lucene里的segment_第1张图片

Inverted Index
最为重要,它主要包括两部分:

  • 一个有序的数据字典(包括单词Term和它出现的频率)
  • 与单词Term对应的Postings(即倒排表,存单词的文件)

当我们搜索时,首先将搜索的内容分解,然后在字典里找到对应的Term,从而查找到与搜索相关的文件内容。
lucene里的segment_第2张图片
根据上图内容,举几个查询例子。

  1. 查询'the fury'
    lucene里的segment_第3张图片
    还记得上一章介绍的lucene四种检索里的‘AND’方式吗?Lucene基本知识
  2. 自动补全(AutoCompletion-Prefix)
    如果想查找字母‘c‘开头的单词,可能简单通过二分查找在Inverted Index表中找到例如'choice','coming'这样的词(Term)
    lucene里的segment_第4张图片
  3. 昂贵的查找
    如果想要查找所有包含'our'字母的单词,那么系统会扫描整个Inverted Index,这是非常昂贵的。
    lucene里的segment_第5张图片
    在此情况下,如果想要做优化,那么我们面对的问题是如何生成合适的Term。一般有下面这些方案:
    1) suffix -> xiffus ,如果我们想以后缀作为搜索条件,可以为Term做反向处理
    2) (60.6384, 6.5017) -> u4u8gyykk
    对于GEO位置信息,可以将它转换成GEO Hash
    3) 123 -> {1-hundreds, 12-tens, 123}
    对于简单的数字,可以为它生成多重形式的Term
  4. 解决拼写错误
    一个python库为单词生成了一个包含错误拼写信息的树形状态机,解决拼写错误的问题。

Stored Field字段查找(待详细补充)
当我们想要查找包含某个特定标题内容的文件时,Inverted Index就不能很好的解决这个问题,所以lucene提供了另外一种数据结构Stored Fields来应对这个问题,本质上,Stored Fields是一个简单的键值对key-value。默认情况下,ES会存储整个文件的JSON source.
lucene里的segment_第6张图片

Document Values为了排序,聚合(待详细补充)
Document values是为了解决排序,聚合,facet问题的,DV结构本质上是一个列式的存储,它高度优化了具有相同类型的数据的存储结构。
lucene里的segment_第7张图片
为了提高效率,ES可以将索引下某一个Document Value全部读取到内存中进行操作,这大大提升访问速度,但是也会消耗大量的内存空间。

参考文章:ES详解 - 原理:从图解构筑对ES原理的初步认知

你可能感兴趣的:(lucene里的segment)